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

關鍵字explicit

成都一家集口碑和實力的網(wǎng)站建設服務商,擁有專業(yè)的企業(yè)建站團隊和靠譜的建站技術,十多年企業(yè)及個人網(wǎng)站建設經(jīng)驗 ,為成都上千家客戶提供網(wǎng)頁設計制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設等服務,包括成都營銷型網(wǎng)站建設,成都品牌網(wǎng)站建設,同時也為不同行業(yè)的客戶提供做網(wǎng)站、成都網(wǎng)站制作的服務,包括成都電商型網(wǎng)站制作建設,裝修行業(yè)網(wǎng)站制作建設,傳統(tǒng)機械行業(yè)網(wǎng)站建設,傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設。在成都做網(wǎng)站,選網(wǎng)站制作建設服務商就選成都創(chuàng)新互聯(lián)公司。

修飾構造方法的關鍵字,加上了,就告訴編譯器,不可以隱式初始化對象;不加就可以隱式初始化對象;
下面的代碼是可以正常編譯執(zhí)行的,但是加了關鍵字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;
}
拷貝構造函數(shù)如果加上了explicit,下面的語句就無法編譯通過;不加可以。
class Test{
public:
 //拷貝構造函數(shù)
 explicit Test(const Test &t){
  data = t.data;
 }
 int getData(){
  return data;
 }
private:
 int data;
};
void test(Test x){

}
int main(){
 Test t2(t1);//調用拷貝構造函數(shù)                    
 //Test t3 = t2;//編譯不過 
 //test(t2);//編譯不過 
}

觸發(fā)拷貝構造函數(shù)的4種方式

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

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

​ Test t3;

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

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

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

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

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

網(wǎng)頁題目:c/c++拷貝構造函數(shù)和關鍵字explicit詳解
標題路徑:http://www.muchs.cn/article24/gdihje.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、關鍵詞優(yōu)化、網(wǎng)站設計電子商務、定制開發(fā)、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設