天天看點

explicit構造函數的作用

explicit構造函數是用來防止隐式轉換的。看下面一段代碼:

class Test1
{
public:
  Test1(int n){num = n ;};   //普通構造函數
private:
  int num ;
};
 
class Test2
{
public:
  explicit Test2(int n ){num = n ;}   //explicit(顯示)構造函數
private:
  int num ;
};
 
int main()
{
  Test1 t1 = 12 ;      //隐式調用其構造函數,成功
  Test2 t2 = 12 ;      //編譯錯誤,不能隐式調用其構造函數
  Test2 t3(12) ;       //顯示調用成功
  return 0 ;
}      

Test1的構造函數帶一個int型參數,代碼第19行會隐式轉換成調用Test1的這個構造函數。而Test2的構造函數被聲明為explicit(顯示),這表示不能通過隐式轉換來調用這個構造函數,是以代碼第20行會出現編譯錯誤。

普通構造函數能被隐式調用,而explicit構造函數隻能被顯示調用。

下面的程式f()被調用時,輸出是什麼:

#include <iostream>
#include <string>
using namespace std ;
 
class Number
{
public:
  string type ;
  Number() : type("void") {}
  explicit Number(short) : type("short") {}
  Number(int) :type("int"){}
};
 
void Show(const Number& n){cout<<n.type ;}
 
void main()
{
  short s = 42 ;
        Show(s) ; 
}      

Show函數的參數類型是Nunmber類對象的引用,代碼第19行調用Show(s)時采取了以下的步驟:

(1)Show(s)中的s為short類型,其值為42,是以首先檢查參數為short的構造函數能否被隐式轉換。由于代碼第10行的構造函數被聲明為顯示調用(explicit),是以不能隐式轉換。于是進行下一步。

(2)42自動轉換為int類型。

(3)檢查參數為int的構造函數能否被隐式轉換。由于代碼第11行參數為int的構造函數沒有被聲明為顯示調用,是以調用此構造函數構造出一個臨時對象。