c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit詳解
關(guān)鍵字explicit
修飾構(gòu)造方法的關(guān)鍵字,加上了,就告訴編譯器,不可以隱式初始化對象;不加就可以隱式初始化對象;
下面的代碼是可以正常編譯執(zhí)行的,但是加了關(guān)鍵字explicit,編譯就會錯我,因為Test t = 100;是隱式初始化對象,但是如果加上強制類型轉(zhuǎn)換后,就不會有錯誤了。
強制類型轉(zhuǎn)換:Test t = (Test)100;
class Test{
public:
Test(int d):data(d){//explicit
cout << "C:" << this << endl;
}
}
int main(){
Test t = 100;
}
拷貝構(gòu)造函數(shù)如果加上了explicit,下面的語句就無法編譯通過;不加可以。
class Test{
public:
//拷貝構(gòu)造函數(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);//調(diào)用拷貝構(gòu)造函數(shù)
//Test t3 = t2;//編譯不過
//test(t2);//編譯不過
}
觸發(fā)拷貝構(gòu)造函數(shù)的4種方式
1,Test t2(t1);//調(diào)用拷貝構(gòu)造函數(shù)
2,聲明的同時就賦值Test t3 = t2會調(diào)用拷貝構(gòu)造函數(shù);但是注意下面這種不會調(diào)用拷貝構(gòu)造函數(shù)。
Test t3;
t3 = t2;//會調(diào)用=的重載方法
3,方法的參數(shù)是對象類型test(t2);
4,方法的返回值是對象類型。原因:對象tmp在方法結(jié)束后就被釋放掉了,要返回到函數(shù)外,必須要復(fù)制tmp.
但是用gdb看了一下在return處并沒有調(diào)用拷貝構(gòu)造函數(shù),所以test方法結(jié)束后,tmp也沒有被釋放,調(diào)用test方法的t5的內(nèi)存地址和tmp是一樣的。個人猜測:老版本的gcc編譯器可能會在return處調(diào)用拷貝構(gòu)造函數(shù),但是新的編譯器(gcc 4.8.5-20)為了提高效率,避免了一次多余的拷貝。
void test(Test x){//進(jìn)入函數(shù)的時點會調(diào)用拷貝構(gòu)造函數(shù)
int value;
value = x.getData();
Test tmp(value);
return tmp;//return的時點會調(diào)用拷貝構(gòu)造函數(shù)
}
Test t5 = test(t1);
相關(guān)文章
Visual Studio 2022 Preview 使用 C++20 Module的詳細(xì)過程
這篇文章主要介紹了Visual Studio 2022 Preview 使用 C++20 Module的過程,本文通過項目分析實例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
Recommended C Style and Coding Standards中文翻譯版
本文翻譯自Recommended C Style and Coding Standards(C語言編碼風(fēng)格和標(biāo)準(zhǔn)),需要的朋友可以參考下2014-04-04
C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的查找和建立
鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語言中單鏈表的查找和建立,感興趣的可以學(xué)習(xí)一下2022-09-09
C++ 中的new 和 delete 運算符及new和malloc的區(qū)別解析
在C++中,又引出了一個新玩法:new 和 delete,在C++中,new是用來動態(tài)開辟內(nèi)存的,delete是用來釋放我們所動態(tài)開辟的內(nèi)存C++中的new和delete運算符及new和malloc的區(qū)別解析,感興趣的朋友跟隨小編一起看看吧2024-11-11

