亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

關于拷貝構造函數和賦值運算符

2019-11-17 05:45:28
字體:
來源:轉載
供稿:網友


作者:馮明德

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


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

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  //調用重載后的"="
}



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区毛片| 深夜精品寂寞黄网站在线观看| 中文字幕av一区中文字幕天堂| 亚洲国产精品va在线看黑人| 亚洲自拍偷拍第一页| 欧美激情久久久久久| 韩国日本不卡在线| 欧美孕妇与黑人孕交| 亚洲国产精品大全| 亚洲综合在线做性| 国产成人精品国内自产拍免费看| 庆余年2免费日韩剧观看大牛| www日韩中文字幕在线看| 欧美一区在线直播| 91久久国产综合久久91精品网站| 亚洲自拍偷拍网址| 亚洲高清一二三区| 欧美国产乱视频| 亚洲黄页网在线观看| 在线视频日本亚洲性| 91精品国产精品| 美乳少妇欧美精品| 国产亚洲欧洲高清一区| 国产精品视频xxxx| 在线电影中文日韩| 欧美国产日韩在线| 久久69精品久久久久久久电影好| 三级精品视频久久久久| 亚洲免费av片| 亚洲国产小视频在线观看| 国自在线精品视频| 欧洲永久精品大片ww免费漫画| 欧美乱大交xxxxx| 欧美亚洲伦理www| 亚洲奶大毛多的老太婆| 欧美激情图片区| 中文字幕亚洲一区在线观看| 国产精品久久久久久av下载红粉| 国产精品久久久久免费a∨大胸| 日韩欧美精品网站| 夜色77av精品影院| 国产91久久婷婷一区二区| 欧美另类极品videosbest最新版本| 88国产精品欧美一区二区三区| 国产日产亚洲精品| 日韩电视剧免费观看网站| 538国产精品视频一区二区| 综合136福利视频在线| 精品露脸国产偷人在视频| 91精品久久久久久久久久久| 成人黄色大片在线免费观看| 69av成年福利视频| 不用播放器成人网| 欧美精品中文字幕一区| 久久久免费av| 国产日韩精品视频| 国产v综合ⅴ日韩v欧美大片| 激情av一区二区| 日韩激情片免费| 欧美精品第一页在线播放| 中文字幕日韩av综合精品| 日韩在线精品一区| 91久久精品国产91久久| 免费91在线视频| 美女久久久久久久久久久| 日韩理论片久久| 精品欧美一区二区三区| 欧美另类极品videosbestfree| 日韩影视在线观看| 国产精品成人一区二区| 久久精品美女视频网站| 亚洲免费视频一区二区| 狠狠色狠色综合曰曰| 中文字幕在线观看亚洲| 自拍偷拍亚洲在线| 激情成人中文字幕| 国内精品久久久久影院 日本资源| 久久久久久久国产精品| 亚洲已满18点击进入在线看片| 久久久精品亚洲| 国产精品久久久久久久久久久久久| 国产亚洲欧美一区| 97婷婷涩涩精品一区| 欧美激情一级精品国产| 欧美精品在线免费播放| 91豆花精品一区| 国产在线观看精品| 精品亚洲永久免费精品| 国产精品黄页免费高清在线观看| 欧美激情久久久| 欧美一级片久久久久久久| 亚洲区免费影片| 欧美午夜片欧美片在线观看| 欧美精品精品精品精品免费| 亚洲国产中文字幕久久网| 欧美色播在线播放| 欧美成人精品影院| 国产亚洲精品综合一区91| 亚洲欧美国产精品va在线观看| 亚洲精品视频免费| 欧美精品第一页在线播放| 日本道色综合久久影院| 午夜精品久久17c| 亚洲最新av在线网站| 国产精品久久久久久久久久久久久| 国产精品人人做人人爽| 91精品国产91久久久久久久久| 国产日韩在线免费| 中文字幕日韩专区| 不卡av在线播放| 日韩av在线精品| 日韩av在线高清| 美女av一区二区| 亚洲free性xxxx护士hd| 欧美中文在线免费| 日韩欧美国产一区二区| 91久久久久久久一区二区| 国产极品精品在线观看| 亚洲国产91精品在线观看| 日韩一区二区av| 国产精品高潮呻吟久久av无限| 欧美激情按摩在线| 久久久亚洲影院你懂的| 一区二区三区视频免费| 欧美亚洲成人xxx| 国产精品一区av| 欧美精品在线免费播放| 97国产一区二区精品久久呦| 精品久久久国产| 久久久久久69| 国语自产精品视频在线看一大j8| 成人免费网站在线看| 日韩电影中文 亚洲精品乱码| 一区二区三区国产视频| 欧美性xxxx| 国产精品亚洲一区二区三区| 欧美人与性动交a欧美精品| 国产成人精品在线视频| 国产丝袜一区二区三区免费视频| 日韩欧美在线视频日韩欧美在线视频| 国产精品美女无圣光视频| 久久久国产成人精品| 欧美日本啪啪无遮挡网站| 精品国产一区二区三区久久狼5月| 亚洲国产高清福利视频| 91色琪琪电影亚洲精品久久| 奇米成人av国产一区二区三区| 久久网福利资源网站| 国产色婷婷国产综合在线理论片a| 国产视频自拍一区| 欧美在线一级va免费观看| 清纯唯美日韩制服另类| 中日韩美女免费视频网址在线观看| 亚洲精品视频免费| 欧美不卡视频一区发布| 亚洲国产免费av| 久久久久久久网站| 奇米4444一区二区三区| 欧美精品www| 亚洲精品视频中文字幕| 亚洲国产精品成人av| 久久亚洲欧美日韩精品专区| 午夜精品久久久久久久男人的天堂| 中文字幕在线视频日韩|