C explicit建構函式例項解析

2022-09-29 16:09:13 字數 1300 閱讀 2230

按照程式設計客棧c語言預設規定,只有乙個引數的建構函式也定義了乙個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件,如下面所示:

class string

string s1 = "hello"; //ok 隱式轉換,等價於string s1 = string("hello");

但是有的時候可能會不需要這種隱式轉換,如下:

class string

下面兩種寫法比較正常:

string s2 ( 10 ); //ok 分配10個位元組的空字串

string s3 = string ( 10 ); //ok 分配10個位元組的空字串

下面兩種寫法就比較疑惑了:

string s4 = 10; //編譯通過,也是分配10個位元組的空字串

string s5 = 'a'; //編譯通過,分配int('a')個位元組的空字串

s4 和s5 分別把乙個int型和char型,隱式轉換成了分配若干位元組的空字串,容易令人誤解。

為了避免這種錯誤的發生,我們可以宣告顯示的轉換,使用explicit 關鍵字:

class string

加上explicit,就抑制了string ( int nbzbybekq )的隱式轉換,

下面兩種寫法仍然正確:

string s2 ( 10 ); //ok 分配10個位元組的空字串

string s3 = string ( 10 ); //ok 分配10個位元組的空字串

下面兩種寫法就不允許了:

string s4 = 10; //編譯不通過,不允許隱式的轉換

string s5 = 'a'; //編譯不通過,不允許隱式的轉換

因此,某些時候,explicit 可以有效得防止建構函式的隱式轉換帶來的錯誤或者誤解

expwww.cppcns.comlicit只對建構函式起作用,用來抑制隱式轉換。如:   

class a;

int function(a a);

當呼叫   function(2)   的時候,2 &nbs 會隱式轉換為   a   型別。這種情況常常不是程式設計師想要的結果,所以,要避免之,就可以這樣寫:   

class a ;

int function(a a);

這樣,當呼叫function(2)的時候,編譯器會給出錯誤資訊(除非function有個以int為引數的過載形式),這就避免了在程式設計師毫不知情的情況下出現錯誤。

總結:explicit只對建構函式起作用,用來抑制隱式轉換。

本文標題: c++ explicit建構函式例項解析

本文位址:

018 C explicit建構函式

英 k spl s t 美 k spl s t adj.明確的,清楚的 直言的 詳述的 不隱瞞的 看到上面的英文解釋,我們應該就知道explicit建構函式是什麼意思了 顯式的建構函式!一 隱式建構函式 如果c 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型...

C explicit關鍵字應用於建構函式

c 程式語言可以被看做是c語言的乙個公升級版本,其中有很多應用方式與c語言相似,但同時又比c語言功能更加強大,應用方式更加靈活。在這裡我們就可以先從c explicit關鍵字的應用方式來具體分析一下這一語言的應用方法。c explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯...

C explicit關鍵字應用於建構函式

c 程式語言可以被看做是c語言的乙個公升級版本,其中有很多應用方式與c語言相似,但同時又比c語言功能更加強大,應用方式更加靈活。在這裡我們就可以先從c explicit關鍵字的應用方式來具體分析一下這一語言的應用方法。c explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯...