国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

c/c++拷貝構造函數和關鍵字explicit詳解

2020-01-26 13:39:25
字體:
來源:轉載
供稿:網友

關鍵字explicit

修飾構造方法的關鍵字,加上了,就告訴編譯器,不可以隱式初始化對象;不加就可以隱式初始化對象;
下面的代碼是可以正常編譯執行的,但是加了關鍵字explicit,編譯就會錯我,因為Test t = 100;是隱式初始化對象,但是如果加上強制類型轉換后,就不會有錯誤了。

強制類型轉換:Test t = (Test)100;

class Test{public: Test(int d):data(d){//explicit   cout << "C:" << this << endl; }}int main(){ Test t = 100;}拷貝構造函數如果加上了explicit,下面的語句就無法編譯通過;不加可以。class Test{public: //拷貝構造函數 explicit Test(const Test &t){  data = t.data; } int getData(){  return data; }private: int data;};void test(Test x){}int main(){ Test t2(t1);//調用拷貝構造函數                     //Test t3 = t2;//編譯不過  //test(t2);//編譯不過 }

觸發拷貝構造函數的4種方式

​ 1,Test t2(t1);//調用拷貝構造函數

​ 2,聲明的同時就賦值Test t3 = t2會調用拷貝構造函數;但是注意下面這種不會調用拷貝構造函數。

​ Test t3;

​ t3 = t2;//會調用=的重載方法

​ 3,方法的參數是對象類型test(t2);

​ 4,方法的返回值是對象類型。原因:對象tmp在方法結束后就被釋放掉了,要返回到函數外,必須要復制tmp.

但是用gdb看了一下在return處并沒有調用拷貝構造函數,所以test方法結束后,tmp也沒有被釋放,調用test方法的t5的內存地址和tmp是一樣的。個人猜測:老版本的gcc編譯器可能會在return處調用拷貝構造函數,但是新的編譯器(gcc 4.8.5-20)為了提高效率,避免了一次多余的拷貝。

void test(Test x){//進入函數的時點會調用拷貝構造函數 int value; value = x.getData(); Test tmp(value); return tmp;//return的時點會調用拷貝構造函數}Test t5 = test(t1);

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 内黄县| 依兰县| 九江市| 余干县| 莒南县| 曲麻莱县| 理塘县| 丽江市| 包头市| 会同县| 浦北县| 宜章县| 大同市| 思茅市| 明水县| 天等县| 桐城市| 东乌珠穆沁旗| 宜兴市| 夏邑县| 陈巴尔虎旗| 民和| 景泰县| 永川市| 长沙市| 旺苍县| 东乌珠穆沁旗| 微博| 上饶县| 宁南县| 平利县| 平南县| 林西县| 铅山县| 班戈县| 雅江县| 习水县| 如东县| 尼勒克县| 南和县| 鹤壁市|