狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美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视频
欧美色爱综合网| 亚洲午夜高清视频| 欧美精品一区二区三区久久久| 91在线免费播放| 国产在线一区观看| 日韩电影免费一区| 一区二区三区四区在线免费观看| 日韩美女视频在线| 欧美日韩国产精品自在自线| 先锋影音久久| 国产欧美一区二区色老头 | 国产精品一二三四五| 免费在线看一区| 午夜久久久久久久久久一区二区| 日韩理论在线观看| 亚洲视频一区二区在线| 国产精品女上位| 国产精品国产馆在线真实露脸| www激情久久| 精品99久久久久久| 欧美va亚洲va香蕉在线| 日韩欧美一区在线| 欧美成人精品二区三区99精品| 91精品国产综合久久久蜜臀图片| 亚洲少妇在线| 欧美一区免费| 亚洲国产清纯| 国产一区二区三区久久| 亚洲一区二区三区高清| 亚洲欧美日韩国产综合精品二区| 先锋影音国产一区| 色美美综合视频| 欧美中文字幕一二三区视频| 色天使久久综合网天天| 欧美色精品在线视频| 欧美色大人视频| 欧美大片顶级少妇| 国产视频在线观看一区二区三区| 国产精品久久久久久久久果冻传媒 | 亚洲午夜在线观看视频在线| 日韩精品国产精品| 亚洲国产精品天堂| 亚洲成人自拍网| 日韩电影网1区2区| 日韩精品一区第一页| 国产麻豆欧美日韩一区| 99久久婷婷国产综合精品| 欧美一区二区三区久久精品茉莉花 | 欧美在线看片| 欧美日韩国产高清视频| 日韩午夜免费| 久久高清国产| 91麻豆精品国产91久久久更新时间| 日韩一区二区三区av| 国产精品三级av在线播放| 亚洲一区自拍偷拍| 黄一区二区三区| 午夜精品亚洲一区二区三区嫩草| 99精品视频免费观看| 欧美男同性恋视频网站| 欧美国产欧美综合| 蜜臀99久久精品久久久久久软件| 成人福利在线看| 91无套直看片红桃| 久久福利毛片| 久久综合色8888| 一片黄亚洲嫩模| 肉色丝袜一区二区| 欧美成人一区二区在线| 欧美综合在线视频| 国产精品私人自拍| 久久精品二区亚洲w码| 91美女视频网站| 色婷婷国产精品| 国产精品女人毛片| 国产曰批免费观看久久久| 好吊色欧美一区二区三区视频| 欧美亚洲国产一区在线观看网站| 91精品国产综合久久久久久| 一级做a爱片久久| av一区二区三区四区| 免费久久久一本精品久久区| 欧美日韩国产高清一区二区| 国产精品久久久久久亚洲毛片 | 美国毛片一区二区三区| 亚洲激情自拍| 久久奇米777| 亚洲一区二区三区四区在线 | 欧美三级在线看| 亚洲人成小说网站色在线| 成人开心网精品视频| 欧美网站一区二区| 亚洲综合在线五月| 国产精品一二三| 国产精品v亚洲精品v日韩精品| 欧美男女性生活在线直播观看| 亚洲精品视频免费观看| 国产精品18久久久| 91黄色在线观看| 亚洲国产cao| 极品中文字幕一区| 国产日韩精品一区| 成人激情小说乱人伦| 日韩视频在线一区二区三区| 久久精品人人做人人综合| 成人网页在线观看| 555夜色666亚洲国产免| 日本视频中文字幕一区二区三区| 亚洲黄色影院| 国产精品天干天干在线综合| 91丨九色porny丨蝌蚪| 日韩一卡二卡三卡四卡| 久久99国产精品久久99果冻传媒| 午夜在线a亚洲v天堂网2018| 国产日韩欧美a| 欧美日韩在线一区二区三区| 国产亚洲欧美一区在线观看| 成人黄色777网| 日韩精品专区在线影院重磅| 国产成人av一区| 91麻豆精品国产| 国产suv精品一区二区6| 91精品国产麻豆国产自产在线| 久久99蜜桃精品| 欧美三区在线观看| 久久国产精品一区二区| 亚洲综合社区| 一二三四社区欧美黄| 免费久久99精品国产自| 日本伊人色综合网| 欧美日韩国产综合草草| 国产精品12区| 久久综合久久综合久久| 韩国av一区| 一区二区三区四区国产精品| 免费视频一区二区三区在线观看| 日韩高清不卡在线| 欧美日韩国产在线观看| 婷婷国产在线综合| 7777精品伊人久久久大香线蕉经典版下载 | 91精品国产一区二区三区| 日本aⅴ免费视频一区二区三区| 一区二区精品在线| 秋霞电影一区二区| 91精品国产91热久久久做人人| eeuss影院一区二区三区| 欧美国产成人精品| 国产精品女主播一区二区三区| 日韩av高清在线观看| 欧美一区二区在线观看| 午夜精品美女久久久久av福利| 亚洲欧美日韩中文播放| 久久国产主播| 免费不卡在线视频| 久久综合av免费| 亚洲一区二区成人| 国产乱码字幕精品高清av| 日本一区二区电影| 午夜一级久久| 国产很黄免费观看久久| 国产精品视频在线看| 久久久水蜜桃| 成人av电影在线| 亚洲国产综合人成综合网站| 欧美午夜不卡在线观看免费| 精品系列免费在线观看| 欧美乱妇15p| 欧美一区二区三区另类| 成人动漫在线一区| 欧美色图第一页| 伊伊综合在线| 99精品国产视频| 久久精品国产99国产精品| 亚洲美女免费在线| 国产拍欧美日韩视频二区| 欧美一区午夜精品| 91黄色激情网站| 亚洲一区二区成人| 亚洲成色最大综合在线| 色综合天天综合网天天狠天天| 国产精品一区二区三区乱码 | 欧美日韩影院| a在线播放不卡| 国产成人av电影| 激情成人午夜视频| 另类小说综合欧美亚洲| 丝袜脚交一区二区| 亚洲国产一区视频| 亚洲欧美激情小说另类| 国产精品网站一区| 国产欧美日韩中文久久| 久久综合九色综合欧美亚洲| 欧美一区二区久久| 日韩一区二区精品葵司在线| 欧美丰满高潮xxxx喷水动漫| 老牛影视一区二区三区| 久久精品一二三区| 美女国产精品| 在线观看www91| 欧美日韩免费观看一区二区三区|