日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别

發(fā)布時間:2025/3/15 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
class TestChild { public:TestChild(){x=0;y=0;printf("TestChild: Constructor be called!\n");}~TestChild(){}TestChild(const TestChild& tc){x=tc.x;y=tc.y;printf("TestChild: Copy Constructor called!//因為寫在了Test(拷貝)構(gòu)造函數(shù)的初始化列表里\n");}const TestChild& operator=(const TestChild& right){x=right.x;y=right.y;printf("TestChild: Operator = be called! //因為寫在了Test(拷貝)構(gòu)造函數(shù)的函數(shù)體里\n");return *this;}int x,y; };class Test { public:Test(){printf("Test: Constructor be called!\n");}explicit Test(const TestChild& tcc){tc=tcc;}~Test(){}Test(const Test& test):tc(test.tc){tc=test.tc;printf("Test: Copy Constructor be called!\n");}const Test & operator=(const Test& right){tc=right.tc;printf("Test: Operator= be called!\n");return *this;}TestChild tc; };int main() {printf("1、Test中包含一個TestChild,這兩個類分別具有構(gòu)造函數(shù)、\n 拷貝構(gòu)造函數(shù)、重載operator=。\n\n");printf("2、在調(diào)用Test的構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)之前,會根據(jù)跟在\n 這些函數(shù)后的初始化列表去初始化其\n TestChild變量(調(diào)用TestChild的拷貝構(gòu)造函數(shù)去初始化)\n\n");printf("3、一旦進入Test的構(gòu)造函數(shù)體或拷貝構(gòu)造函數(shù)體,則說明其成員變量TestChild已\n 經(jīng)通過TestChild的構(gòu)造函數(shù)或TestChild的拷貝構(gòu)造函數(shù)構(gòu)造出了對象\n");printf(" 所以,在Test的構(gòu)造函數(shù)體或拷貝構(gòu)造函數(shù)體中,再去使用=號\n 給TestChild的時候,調(diào)用的就是TestChild的operator=,\n 而不是TestChild的拷貝構(gòu)造函數(shù)了\n");printf(" 這就是Test構(gòu)造函數(shù)后面 “:” 初始化列表的存在意義!(\n 為了調(diào)用成員變量的構(gòu)造函數(shù)或者拷貝構(gòu)造函數(shù))\n\n");printf("4、最后!揪出讓人困惑的終極原因!!!!!\n Test test2=test1和Test test2(test1)這兩種是TM一模一樣的\n (都調(diào)用拷貝構(gòu)造函數(shù))!!!!除了這點兒之外,其他地方都是該是什么是什么(\"()\"調(diào)用構(gòu)造函數(shù),\"=\"調(diào)用賦值操作符)!!!\n\n");printf("5、一個對象初始化完畢后,所有對這個對象的賦值都調(diào)用operator=\n\n輸出如下:");printf("Test test1; DO:\n");Test test1;printf("\n");printf("Test test2=test1; DO:\n");Test test2=test1;printf("\n");printf("Test test3(test2); DO:\n");Test test3(test2);printf("\n");printf("test3=test1; DO:\n");test3=test1;return 0; }

?

?搞清楚這個之后我對C++真尼瑪是萬念俱灰。。C++這個女強人能學(xué)點兒C#小蘿莉小鳥依人的優(yōu)點么!!!!!!!!!!!!!!

?嗯,其實C++的溫柔沒有被發(fā)現(xiàn)~ 她很貼心的發(fā)明了explicit這個關(guān)鍵字,如果把這個關(guān)鍵字加在構(gòu)造函數(shù)之前,那么Test test2=test1;這樣的初始化或者隱式類型轉(zhuǎn)化是不能通過編譯的

?

?

?

?

原文轉(zhuǎn)自:http://www.cnblogs.com/darknightsnow/archive/2012/10/17/2728078.html

原作者為 暗夜的雪. 請尊重原作者版權(quán)

?

轉(zhuǎn)載于:https://www.cnblogs.com/LonelyEnvoy/p/5957092.html

總結(jié)

以上是生活随笔為你收集整理的C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。