c中的建構函式前加上eplicit有什麼用

2021-03-07 02:01:04 字數 1500 閱讀 7023

1樓:匿名使用者

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建構函式只能被顯示呼叫。

2樓:匿名使用者

測試一下這段**,然後把t的建構函式前面加上explicit再測一下看會有什麼錯誤?

class t

int geti()const

private:

int n;

};void fun(t &t)

int main()

3樓:匿名使用者

class stack

explicit 表示禁止從型別int到型別stack的隱式轉換:

stack s1(40); // ok

stack s2 = 40; // error推薦c++ 語言作者寫的書《c++程式設計語言》,關於c++ 這門語言,你想知道的裡面幾乎都有哈!

c++中explicit關鍵字是什麼意思?

4樓:倒黴熊

關鍵字explicit可以禁止bai「單引數構造du函式」被用於自動類zhi型dao轉換

class stack

;沒有explicit的話

內stack s = 40;能編譯通過

而有explicit則不能,必需

容stack s(40);

c 類中的建構函式 point int x,int y x x ,y y其中x和y已被宣告

建構函式的引數不要和類成員一樣。起碼寫成point int x t,int y y x x t y y t 這段 的意思是初始化x x,y y c 中point int x,int y x x y y 是什麼意思 建構函式冒號後頭那個叫初始化列表,用於初始化類的成員屬性,這裡相當於內 point i...

C中如何呼叫靜態類中的建構函式

靜態建構函式既沒有訪問修飾符,也沒有引數。如果沒有編寫靜態建構函式,而這時類中包含帶有初始值設定的靜態欄位,那麼編譯器會自動生成預設的靜態建構函式。在建立第一個類例項或任何靜態成員被引用時,net將自動呼叫靜態建構函式來初始化類,也就是說我們無法直接呼叫靜態建構函式,也就無法控制什麼時候執行靜態建構...

描述建構函式如何在繼承中使用,關於C 中建構函式的繼承的問題。

繼承技術是物件導向程式設計的主要特徵。物件導向程式語言引入繼承機制,可以實現 重用,提高程式設計效率。c 只支援單繼承,即一個派生類只能有一個基類。類的繼承性是指一個類定義既可以具有其他類的資料成員 屬性成員 方法成員等,也可以使其他類具有自己的資料成員 屬性成員 方法成員等。在類的繼承中,被繼承的...