c++基礎知識繁多,對於不太常用,易用錯的關鍵字需要總結一下。
(1)explicit關鍵字只是用來修飾構造函數的,而且它只會出現在類中的構造函數聲明之前(定義之前再出現就錯了)。
(2)explicit關鍵字是用來抑制由構造函數定義的隱式轉換的。
如下代碼:
class MyClass
{
public:
MyClass( int num );
}
MyClass obj = 10; //ok,convert int to MyClass
當定義了MyClass類的MyClass(int num);構造函數後,C++就允許最後一行的那種構造方法,這就叫做由構造函數定義的隱式轉換 。
class MyClass
{
public:
explicit MyClass( int num ); //add a explicit in front of constructor
}
MyClass obj = 10; //compiler error, implicit convert is not allowed now.
MyClass obj = MyClass(10); //OK, because this is a explicit convert.
當定義了explicit關鍵字後,隱式轉換就會報錯。這時只能使用顯式轉換 。
或者包裝的再復雜一些:
#include
using namespace std;
class Book
{
public:
int num;
Book(int n) {
num = n;
}
Book() {
}
protected:
private:
};
class Books
{
public:
Book b;
Books(Book tmp) {
b=tmp;
}
protected:
private:
};
int main()
{
Books books(2); //此時可行
return 0;
}
其實這裡就是將2隱式轉換成了Book類
但如果,將 Book(int n) 前加 explicit,就不能隱式調用了
注意 :
explicit關鍵字只需要在類定義中的構造函數聲明語句的頭部書寫,在構造函數的定義處不用寫了。寫了會報錯。
使用的建議 :
如果沒有很合適的理由說明必須使用隱式轉換,而且如果你的構造函數是單形參可調用,那麼最好聲明explicit,這樣可以避免錯誤。當然,多形參調用的構造函數是沒有構造函數的隱式轉換的,所以也沒必要聲明explicit。