91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-24 21:55:22 來源:腳本之家 閱讀:206 作者:小石王 欄目:編程語言

關鍵字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);

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新乡市| 阳谷县| 奉节县| 修水县| 潮州市| 班戈县| 万山特区| 新邵县| 聊城市| 北流市| 建阳市| 白城市| 泗水县| 军事| 清镇市| 甘南县| 陆良县| 金山区| 自治县| 尚志市| 冷水江市| 扎赉特旗| 桃园市| 大宁县| 六安市| 武功县| 三原县| 洛南县| 昭觉县| 宁陕县| 会宁县| 白城市| 辰溪县| 益阳市| 安乡县| 彭山县| 车致| 佳木斯市| 九江县| 石城县| 额济纳旗|