1樓:倒黴熊
關鍵字explicit可以禁止bai「單引數構造du函式」被用於自動類zhi型dao轉換
class stack
;沒有explicit的話
內stack s = 40;能編譯通過
而有explicit則不能,必需
容stack s(40);
c++中的建構函式..前加上explicit有什麼用??
2樓:匿名使用者
c++提供了關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生。宣告為explicit的建構函式不能在隱式轉換中使用。
c++中, 一個引數的建構函式, 承擔了兩個角色。 1 是個構造器 2 是個預設且隱含的型別轉換操作符。
所以, 有時候在我們寫下如 aaa = ***, 這樣的**, 且恰好***的型別正好是aaa單引數構造器的引數型別, 這時候編譯器就自動呼叫這個構造器, 建立一個aaa的物件。
這樣看起來好象很酷, 很方便。 但在某些情況下(見下面權威的例子), 卻違背了我們(程式設計師)的本意。 真是成也蕭何, 敗也蕭何。
這時候就要在這個構造器前面加上explicit修飾, 指定這個構造器只能被明確的呼叫,使用, 不能作為型別轉換操作符被隱含的使用。 呵呵, 看來還是光明正大些比較好。
explicit建構函式的作用
解析:explicit建構函式是用來防止隱式轉換的。請看下面的**:
1 class test1
2 //普通建構函式
5 private:
6 int num;
7 };
8 9 class test2
10 //explicit(顯式)建構函式
13 private:
14 int num;
15 };
16 17 int main()
18 test1的建構函式帶一個int型的引數,**19行會隱式轉換成呼叫test1的這個建構函式。而test2的建構函式被宣告為explicit(顯式),這表示不能通過隱式轉換來呼叫這個建構函式,因此**20行會出現編譯錯誤。
普通建構函式能夠被隱式呼叫。而explicit建構函式只能被顯示呼叫。
3樓:匿名使用者
測試一下這段**,然後把t的建構函式前面加上explicit再測一下看會有什麼錯誤?
class t
int geti()const
private:
int n;
};void fun(t &t)
int main()
4樓:匿名使用者
class stack
explicit 表示禁止從型別int到型別stack的隱式轉換:
stack s1(40); // ok
stack s2 = 40; // error推薦c++ 語言作者寫的書《c++程式設計語言》,關於c++ 這門語言,你想知道的裡面幾乎都有哈!
資料庫中的關鍵字,主關鍵字,外關鍵字
因為學號和課copy號 組成了一個唯一標識 哪個學生的成績啊!在s中學號是主關鍵字 sc是s和c表延伸的表 在sc中學號和課號是關鍵字 但是不是主關鍵字 因為並不能只通過學號或課號能唯一確定哪個個學生的成績 同一個學生可以選多個課程 而同樣 同一個課程可以有很多同學選擇 所以必須要兩個關鍵字 才能確...
c中的const何readonly關鍵字含義和作用有什麼區
常數表示式是在編譯時可被完全計算的表示式。因此不能從一個變數中提取的值來初始化常量。如果const int a b 1 b是一個變數,顯然不能再編譯時就計算出結果,所以常量是不可以用變數來初始化的。readonly 允許把一個欄位設定成常量,但可以執行一些運算,可以確定它的初始值。因為readonl...
c語言裡面的關鍵字發音,c語言裡面的32個關鍵字發音
中文譯音跟後面了 auto 宣告自動變數 一般不使用 奧透 double 宣告雙精度變數或函式 大伯歐 int 宣告整型變數或函式 因特 struct 宣告結構體變數或函式 四抓科特 break 跳出當前迴圈 布瑞克 else 條件語句否定分支 與 if 連用 愛歐斯 long 宣告長整型變數或函式...