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