關於explicit的應用

2021-09-30 12:12:45 字數 1473 閱讀 2702

什麼是explicit呢?很簡單,他就是乙個讓隱式格式轉換失效的關鍵字。

c++提供了

關鍵字explicit,可以阻止不應該允許的經過

轉換建構函式

進行的隱式轉換的發生。宣告為explicit的

建構函式

不能在隱式轉換中使用。

下面解釋一下:

explicit student(const std::string & s):name(s),scores(){}

explicit student(int n):name("nully"),scores(n){}

我以前提到過,可以用乙個引數呼叫的勾走函式將用作從引數型別到類型別的隱式轉換函式;但這通常不是好主意。在上述的第二個建構函式中,第乙個引數表示陣列元素的個數,不是陣列中的值,因此,將乙個建構函式用作int到student的轉換函式式沒有意義的,所以使用explicit關閉隱式轉換。如果省略了該關鍵字,則可以編寫如下的**:

student doh("homer",10);

doh=5;

在這裡,馬虎的程式設計師鍵入的doh而不是doh[0],如果建構函式省略了explicit,則將使用構造函式呼叫student(5)將5轉換為乙個臨時student物件,並使用「nully」來設定成員name的值,因此賦值操作將使用臨時物件替換原來的doh值,使用exolicit後,編譯器將認為上述賦值運算子是錯誤的。

c++中, 乙個引數的建構函式(或者除了第乙個引數外其餘引數都有預設值的多參建構函式), 承擔了兩個角色。 1 是個構造器 ,2 是個預設且隱含的型別轉換操作符。

所以, 有時候在我們寫下如 aaa = ***, 這樣的**, 且恰好***的型別正好是aaa單引數構造器的引數型別, 這時候編譯器就自動呼叫這個構造器, 建立乙個aaa的物件。

這樣看起來好象很酷, 很方便。 但在某些情況下(見下面權威的例子), 卻違背了我們(程式設計師)的本意。 這時候就要在這個構造器前面加上explicit修飾, 指定這個構造器只能被明確的呼叫,使用, 不能作為型別轉換操作符被隱含的使用。 呵呵, 看來還是光明正大些比較好。

explicit建構函式的作用

解析:explicit建構函式是用來防止隱式轉換的。請看下面的**:

classtest1

//普通建構函式

private:

intnum;

};classtest2

//explicit(顯式)建構函式

private:

intnum;

};intmain()

test1的建構函式帶乙個int型的引數,**17行會隱式轉換成呼叫test1的這個建構函式。而test2的建構函式被宣告為explicit(顯式),這表示不能通過隱式轉換來呼叫這個建構函式,因此**18行會出現編譯錯誤。

普通建構函式能夠被隱式呼叫。而explicit建構函式只能被顯式呼叫。

關於explicit關鍵字

今天在看乙個源程式的時候用到了explicit關鍵字。在網上查詢了一下該關鍵字的作用。沒有進行試驗,只是整理了下 1.explicit主要和建構函式一起使用.2.當explicit修飾建構函式的時候,對於呼叫該建構函式進行進行 隱式 轉換的 將不會通過 3.解除explicit的方式,就是使用強制轉...

關於explicit關鍵字的用法

explicit關鍵字的作用 禁止隱式呼叫類內的單引數建構函式,這主要包括如下三層意思 1 該關鍵字只能用來修飾類內部的建構函式 2 禁止隱式呼叫拷貝建構函式 3 禁止類物件之間的隱式轉換 關於explicit的隱式轉換,例子 class cexplict cexplict const cexpli...

應用篇 explicit宣告的建構函式作用

explicit建構函式是用來防止隱式轉換的。請看下面的 1class test1 2 普通建構函式 5private 6 int num 7 89class test2 10 explicit 顯式 建構函式 13private 14 int num 15 1617 int main 18注 te...