狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當前位置:系統之家 > 技術開發教程 > 詳細頁面

對于拷貝構造函數與賦值運算符

對于拷貝構造函數與賦值運算符

更新時間:2019-05-03 文章作者:未知 信息來源:網絡 閱讀次數:


作者:馮明德

重點:包含動態分配成員的類 應提供拷貝構造函數,并重載"="賦值操作符。


以下討論中將用到的例子:

class CExample
{
public:
CExample(){pBuffer=NULL; nSize=0;}
~CExample(){delete pBuffer;}
void Init(int n){ pBuffer=new char[n]; nSize=n;}
private:
char *pBuffer; //類的對象中包含指針,指向動態分配的內存資源
int nSize;
};


這個類的主要特點是包含指向其他資源的指針。

pBuffer指向堆中分配的一段內存空間。


一、拷貝構造函數

int main(int argc, char* argv[])
{
CExample theObjone;
theObjone.Init40);

//現在需要另一個對象,需要將他初始化稱對象一的狀態
CExample theObjtwo=theObjone;
...
}


語句"CExample theObjtwo=theObjone;"用theObjone初始化theObjtwo。

其完成方式是內存拷貝,復制所有成員的值。

完成后,theObjtwo.pBuffer==theObjone.pBuffer。

即它們將指向同樣的地方,指針雖然復制了,但所指向的空間并沒有復制,而是由兩個對象共用了。這樣不符合要求,對象之間不獨立了,并為空間的刪除帶來隱患。

所以需要采用必要的手段來避免此類情況。

回顧以下此語句的具體過程:首先建立對象theObjtwo,并調用其構造函數,然后成員被拷貝。

可以在構造函數中添加操作來解決指針成員的問題。

所以C++語法中除了提供缺省形式的構造函數外,還規范了另一種特殊的構造函數:拷貝構造函數,上面的語句中,如果類中定義了拷貝構造函數,這對象建立時,調用的將是拷貝構造函數,在拷貝構造函數中,可以根據傳入的變量,復制指針所指向的資源。


拷貝構造函數的格式為:構造函數名(對象的引用)

提供了拷貝構造函數后的CExample類定義為:

class CExample
{
public:
CExample(){pBuffer=NULL; nSize=0;}
~CExample(){delete pBuffer;}
CExample(const CExample&); //拷貝構造函數
void Init(int n){ pBuffer=new char[n]; nSize=n;}
private:
char *pBuffer; //類的對象中包含指針,指向動態分配的內存資源
int nSize;
};

CExample::CExample(const CExample& RightSides) //拷貝構造函數的定義
{
nSize=RightSides.nSize; //復制常規成員
pBuffer=new char[nSize]; //復制指針指向的內容
memcpy(pBuffer,RightSides.pBuffer,nSize*sizeof(char));
}


這樣,定義新對象,并用已有對象初始化新對象時,CExample(const CExample& RightSides)將被調用,而已有對象用別名RightSides傳給構造函數,以用來作復制。


原則上,應該為所有包含動態分配成員的類都提供拷貝構造函數。


拷貝構造函數的另一種調用。


當對象直接作為參數傳給函數時,函數將建立對象的臨時拷貝,這個拷貝過程也將調同拷貝構造函數。

例如

BOOL testfunc(CExample obj);

testfunc(theObjone); //對象直接作為參數。

BOOL testfunc(CExample obj)
{
//針對obj的操作實際上是針對復制后的臨時拷貝進行的
}


還有一種情況,也是與臨時對象有關的

當函數中的局部對象被被返回給函數調者時,也將建立此局部對象的一個臨時拷貝,拷貝構造函數也將被調用


CTest func()
{
CTest theTest;
return theTest
}


二、賦值符的重載

下面的代碼與上例相似

int main(int argc, char* argv[])
{
CExample theObjone;
theObjone.Init(40);

CExample theObjthree;
theObjthree.Init(60);

//現在需要一個對象賦值操作,被賦值對象的原內容被清除,并用右邊對象的內容填充。
theObjthree=theObjone;
return 0;
}


也用到了"="號,但與"一、"中的例子并不同,"一、"的例子中,"="在對象聲明語句中,表示初始化。更多時候,這種初始化也可用括號表示。

例如 CExample theObjone(theObjtwo);

而本例子中,"="表示賦值操作。將對象theObjone的內容復制到對象theObjthree;,這其中涉及到對象theObjthree原有內容的丟棄,新內容的復制。

但"="的缺省操作只是將成員變量的值相應復制。舊的值被自然丟棄。

由于對象內包含指針,將造成不良后果:指針的值被丟棄了,但指針指向的內容并未釋放。指針的值被復制了,但指針所指內容并未復制。


因此,包含動態分配成員的類除提供拷貝構造函數外,還應該考慮重載"="賦值操作符號。

類定義變為:

class CExample
{
...
CExample(const CExample&); //拷貝構造函數
CExample& operator = (const CExample&); //賦值符重載
...
};


//賦值操作符重載
CExample & CExample::operator = (const CExample& RightSides)
{
nSize=RightSides.nSize; //復制常規成員
char *temp=new char[nSize]; //復制指針指向的內容
memcpy(temp,RightSides.pBuffer,nSize*sizeof(char));

delete []pBuffer; //刪除原指針指向內容  (將刪除操作放在后面,避免X=X特殊情況下,內容的丟失)
pBuffer=temp;   //建立新指向
return *this
}

三、拷貝構造函數使用賦值運算符重載的代碼。

CExample::CExample(const CExample& RightSides)
{
pBuffer=NULL;
*this=RightSides  //調用重載后的"="
}

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
国产成人av电影| 欧美一区二区视频在线观看2022| 美女主播一区| 欧美色视频在线| 久久久www成人免费毛片麻豆| 国产精品三级视频| 免费成人结看片| 91蜜桃传媒精品久久久一区二区| 香蕉视频成人在线观看| 欧美一级黄色片| 亚洲狼人国产精品| 国产精品888| av成人天堂| 777午夜精品视频在线播放| 一区免费观看视频| 国产一区二区美女诱惑| 亚洲日本欧美| 精品久久国产字幕高潮| 日韩电影一二三区| 欧美午夜欧美| 日韩精品中文字幕在线一区| 亚洲黄色小说网站| 91在线视频播放地址| 91久久线看在观草草青青| 国产欧美久久久精品影院| 免费不卡在线视频| 日韩一级欧洲| 久久久久久久久久久电影| 久久精品国产999大香线蕉| 韩国一区二区三区在线观看| 欧美日韩不卡视频| 亚洲成av人影院| 国产精品yjizz| 精品久久一区二区三区| 久久精品国产亚洲高清剧情介绍 | 久久99国内精品| 激情久久中文字幕| 欧美videos大乳护士334| 日韩电影在线一区二区三区| 欧美 日韩 国产在线| 欧美精品粉嫩高潮一区二区| 亚洲一二三专区| 韩国一区二区三区美女美女秀| 欧美成人三级电影在线| 天堂在线亚洲视频| 国产欧美三级| 中文字幕日本乱码精品影院| 91网址在线看| 精品对白一区国产伦| 国产精品18久久久久久久久久久久 | 欧美videos中文字幕| 国产一区二区三区黄视频| 欧美性极品少妇| 美国毛片一区二区| 久久av在线| 丝袜a∨在线一区二区三区不卡| 99精品免费视频| 国产精品久久久久久久浪潮网站| 午夜日韩在线| 欧美激情一二三区| 国内一区二区三区在线视频| 国产女人aaa级久久久级 | 午夜天堂影视香蕉久久| 国产亚洲欧美一区二区| 欧美日韩成人一区| 欧美777四色影| 国产精品免费观看视频| 精品动漫一区| 日韩中文字幕91| 日韩精品中文字幕一区| 日韩av网站在线观看| 亚洲主播在线| 麻豆精品久久久| 国产精品午夜春色av| 亚洲欧美日韩综合一区| 亚洲免费高清| 一本不卡影院| 色综合激情久久| 欧美午夜一区二区三区免费大片| 久久最新视频| 日韩免费看的电影| 免费亚洲电影在线| 亚洲精品乱码久久久久久久久 | 激情欧美一区二区三区| 欧美一区视频| 激情久久一区| 国产日韩欧美一区| 日本韩国一区二区| 欧美肥妇毛茸茸| 久久奇米777| 亚洲女人****多毛耸耸8| 1024亚洲合集| 喷水一区二区三区| 成人动漫一区二区在线| 欧美日韩精品不卡| 国产日韩三区| 日韩欧美在线影院| 国产精品―色哟哟| 另类综合日韩欧美亚洲| 国产91富婆露脸刺激对白| 欧美 日韩 国产精品免费观看| 欧美一区二区在线| 国产成人午夜精品影院观看视频| 亚洲国产精品一区二区www| 国产亚洲污的网站| 在线免费一区三区| 新67194成人永久网站| 欧美视频一区二区| 91精品欧美一区二区三区综合在| 中文字幕日韩av资源站| 日本高清视频一区二区| 成人av电影在线播放| 一区二区三区在线观看国产| 欧美嫩在线观看| 伊人久久亚洲热| 久久精品国产精品青草| 欧美极品aⅴ影院| 欧美三级日韩三级| 亚洲一级影院| 盗摄精品av一区二区三区| 亚洲激情自拍视频| 精品国产91乱码一区二区三区| 国产午夜精品一区二区三区欧美 | 欧洲av一区二区嗯嗯嗯啊| 91麻豆国产在线观看| 青椒成人免费视频| 日本一区二区三区dvd视频在线| 欧美三级韩国三级日本三斤| 精品电影一区| 岛国精品在线观看| 日本午夜精品视频在线观看| 国产精品免费aⅴ片在线观看| 欧美日本国产一区| 亚洲深夜av| 你懂的网址国产 欧美| 国内精品伊人久久久久av影院 | 欧美猛男gaygay网站| 99在线精品免费视频九九视 | 亚洲成人免费影院| 一区免费观看视频| 亚洲精品一线二线三线| 欧美三电影在线| 蜜桃视频一区| 黄色免费成人| 99re热这里只有精品视频| 国精产品一区一区三区mba视频| 亚洲动漫第一页| 18欧美乱大交hd1984| 欧美国产1区2区| 国产亚洲一区字幕| 欧美mv日韩mv| 日韩一区二区免费高清| 欧美午夜不卡在线观看免费| 久久xxxx精品视频| 国产日韩欧美三级| 亚洲伦理一区| 亚洲精品一二| 91久久夜色精品国产九色| 欧美三级第一页| 欧美女激情福利| 欧美日韩亚洲一区在线观看| 91在线精品秘密一区二区| 国产91精品久久久久久久网曝门 | 中国色在线观看另类| 欧美国产乱子伦| 国产日韩精品一区二区浪潮av| 日韩亚洲欧美高清| 7777女厕盗摄久久久| 欧美日韩一区二区三区四区五区 | 亚洲成人先锋电影| 色婷婷综合久久久中文字幕| 性xx色xx综合久久久xx| 国产91色综合久久免费分享| 一区二区三区在线观看欧美| 国产免费成人在线视频| 精品久久久久一区二区国产| 3d动漫精品啪啪1区2区免费 | 亚洲精品国产一区二区精华液 | 婷婷中文字幕一区三区| 亚洲免费观看视频| 国产精品理论在线观看| 国产精品网站在线观看| www久久精品| 欧美va亚洲va在线观看蝴蝶网| 欧美男男青年gay1069videost| 久久亚洲综合网| 蜜乳av另类精品一区二区| 91久久久免费一区二区| 老司机一区二区三区| 一级成人国产| 99精品在线观看视频| 国内成+人亚洲| 1024亚洲| 99国内精品| 欧美影院午夜播放| 欧美无砖砖区免费| 欧美乱妇15p| 中文字幕精品三区| 中文字幕欧美激情一区| 国产精品第一页第二页第三页|