c c 拷貝建構函式和關鍵字explicit詳解

2022-09-27 02:00:18 字數 935 閱讀 5552

關鍵字explicit

修飾構造方法的關鍵字,加上了,就告訴編譯器,不可以隱式初始化物件;不加就可以隱式初始化物件;

下程式設計客棧面的**是可以正常編譯執行的,但是加了關鍵字explicit,編譯就會錯我,因為test t = 100;是隱式初始化物件,但是如果加上強制型別轉換後,就不會有錯誤了。

強制型別轉換:test t = (test)100;

class test

}int main()

拷貝建構函式如果加上了explicit,下面的語句就無法編譯通過;不加可以。

class test

int getdata()

private:

int data;

};void test(test x)

int main()

觸發拷貝建構函式的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)為了提高效率,避免了一次多餘的拷貝。

phhfctqgvoid test(test x)

test t5 = test(t1);

本文標題: c/c++拷貝建構函式和關鍵字explicit詳解

本文位址:

建構函式,This關鍵字

建構函式 即構建創造物件時呼叫的函式。在new的時候自動執行,給物件進行初始化。建立物件都必須要通過建構函式初始化。有參和無參 乙個類中如果沒有定義過建構函式,那麼類中會有乙個預設的空引數建構函式。特點 1.函式名與類名相同。2.無返回值。例項變數的預設值 原始數字型別的例項變數預設值為0,布林型變...

malloc函式和new關鍵字 C C

malloc free malloc是c語言中動態開闢記憶體時常用的函式,malloc只能單純地開闢記憶體,使用malloc後,還需要在使用完之後用free釋放掉其所開闢的空間。其函式原型如下 void malloc size t size void 指向的是乙個半開半閉的區間,即 因此不安全c和c...

構造器和this關鍵字

預設構造器 當類中沒有顯示的宣告任何構造器,編譯器會 自動生成乙個預設的構造器 預設構造器與類的訪問許可權相同,引數列表為空 呼叫父類的預設構造器super 如果類中顯式的宣告了構造器,預設的構造器將不再存在 構造器重載 宣告多個構造器,可實現多種初始化方式 使用乙個構造器呼叫乙個構造器的實現 呼叫...