c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit詳解
關(guān)鍵字explicit
修飾構(gòu)造方法的關(guān)鍵字,加上了,就告訴編譯器,不可以隱式初始化對(duì)象;不加就可以隱式初始化對(duì)象;
下面的代碼是可以正常編譯執(zhí)行的,但是加了關(guān)鍵字explicit,編譯就會(huì)錯(cuò)我,因?yàn)門(mén)est t = 100;是隱式初始化對(duì)象,但是如果加上強(qiáng)制類(lèi)型轉(zhuǎn)換后,就不會(huì)有錯(cuò)誤了。
強(qiáng)制類(lèi)型轉(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,下面的語(yǔ)句就無(wú)法編譯通過(guò);不加可以。 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;//編譯不過(guò) //test(t2);//編譯不過(guò) }
觸發(fā)拷貝構(gòu)造函數(shù)的4種方式
1,Test t2(t1);//調(diào)用拷貝構(gòu)造函數(shù)
2,聲明的同時(shí)就賦值Test t3 = t2會(huì)調(diào)用拷貝構(gòu)造函數(shù);但是注意下面這種不會(huì)調(diào)用拷貝構(gòu)造函數(shù)。
Test t3;
t3 = t2;//會(huì)調(diào)用=的重載方法
3,方法的參數(shù)是對(duì)象類(lèi)型test(t2);
4,方法的返回值是對(duì)象類(lèi)型。原因:對(duì)象tmp在方法結(jié)束后就被釋放掉了,要返回到函數(shù)外,必須要復(fù)制tmp.
但是用gdb看了一下在return處并沒(méi)有調(diào)用拷貝構(gòu)造函數(shù),所以test方法結(jié)束后,tmp也沒(méi)有被釋放,調(diào)用test方法的t5的內(nèi)存地址和tmp是一樣的。個(gè)人猜測(cè):老版本的gcc編譯器可能會(huì)在return處調(diào)用拷貝構(gòu)造函數(shù),但是新的編譯器(gcc 4.8.5-20)為了提高效率,避免了一次多余的拷貝。
void test(Test x){//進(jìn)入函數(shù)的時(shí)點(diǎn)會(huì)調(diào)用拷貝構(gòu)造函數(shù) int value; value = x.getData(); Test tmp(value); return tmp;//return的時(shí)點(diǎn)會(huì)調(diào)用拷貝構(gòu)造函數(shù) } Test t5 = test(t1);
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)紙牌游戲之小貓釣魚(yú)算法
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)紙牌游戲之小貓釣魚(yú)算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)樹(shù)的雙親表示法實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)樹(shù)的雙親表示法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06C++進(jìn)程的創(chuàng)建和進(jìn)程ID標(biāo)識(shí)詳細(xì)介紹
傳統(tǒng)的C++(C++98)中并沒(méi)有引入線程這個(gè)概念。linux和unix操作系統(tǒng)的設(shè)計(jì)采用的是多進(jìn)程,進(jìn)程間的通信十分方便,同時(shí)進(jìn)程之間互相有著獨(dú)立的空間,不會(huì)污染其他進(jìn)程的數(shù)據(jù),天然的隔離性給程序的穩(wěn)定性帶來(lái)了很大的保障2022-08-08C++實(shí)現(xiàn)讀取特定路徑下文件夾及文件名的方法
這篇文章主要介紹了C++實(shí)現(xiàn)讀取特定路徑下文件夾及文件名的方法,需要的朋友可以參考下2014-07-07