在C++中,explicit關鍵字用來修飾類的構造函數,被修飾的構造函數的類,不能發生相應的隐式類型轉換,隻能以顯示的方式進行類型轉換。MSDN上的解釋:
This keyword is a declaration specifier that can only be applied to in-class constructor declarations . An explicit constructor cannot take part in implicit conversions. It can only be used to explicitly construct an object 。
可以看到, explicit關鍵字的作用: 禁止隐式調用類内的單參數構造函數, 這主要包括三層意思:
(1)該關鍵字隻能用來修飾類内部的構造函數
(2)禁止隐式調用拷貝構造函數
(3)禁止類對象之間的隐式轉換
class People
{
public:
int age;
explicit People (int a)//加上了explict關鍵字的構造函數
{
age=a;
}
};
void foo ( void )
{
People p1(10); //方式一,顯示調用,編譯通過
People p3=10; //方式二,隐式調用,編譯不通過
}
總結:explicit 隻對構造函數起作用,用來抑制隐式轉換,一般隻将有單個參數的constructor聲明為explicit,而copy constructor不要聲明為explicit。explicit關鍵字隻對有一個參數的類構造函數有效, 如果類構造函數參數大于或等于兩個時, 是不會産生隐式轉換的, 此時explicit關鍵字無效:
class DefString // 在類構造函數參數大于或等于兩個時,explicit關鍵字無效
{
public:
char *pstr;
int age;
int size;
explicit DefString(int age, int size)
{
this->age = age;
this->size = size; .
}
};