天天看點

C++入門學習——explicit關鍵字的作用

C++ 語言可以定義如何将其他類型的對象隐式轉換為我們的類類型, 或将我們的類類型的對象隐式轉換為其他類型。

下面為類類型的隐式轉換的示例代碼:

#include <iostream>
using namespace std;

class A
{
public:
  A(int temp) //普通構造函數
  {
    a = temp;
    cout << "普通構造函數: a= " << a << endl;
  }
  
  A(const A &temp) //拷貝構造函數
  {
    a = temp.a;
    cout << "拷貝構造函數: a = " << a << endl;
  }
  
private:
  int a;
};

int main()
{
  cout << "顯示調用:" << endl;
  A a(250); //顯式調用調用普通構造函數,ok
  A b(a);   //顯式調用調用拷貝構造函數,ok
  
  cout << "\n隐式轉換:" << endl;
  A c=222; //隐式轉換成調用普通構造函數,ok
  A d=c;   //隐式轉換成調用拷貝構造函數,ok

  return 0;  
}      

編譯運作結果如下:

C++入門學習——explicit關鍵字的作用

如果要避免這種自動轉換的功能,我們該怎麼做呢?C++提供了關鍵字explicit,可以阻止不應該允許的經過轉換構造函數進行的隐式轉換的發生。

c++中的explicit關鍵字抑制由構造函數定義的隐式轉換。explicit關鍵字隻能用于類内部的構造函數聲明上。在類的定義體外部所做的定義上不要加explicit關鍵字。

示例代碼如下:

#include <iostream>
using namespace std;

class A
{
public:
  explicit A(int temp) //普通構造函數,被聲明為explicit(顯式)
  {
    a = temp;
    cout << "普通構造函數: a= " << a << endl;
  }
  
  explicit A(const A &temp) //拷貝構造函數,被聲明為explicit(顯式)
  {
    a = temp.a;
    cout << "拷貝構造函數: a = " << a << endl;
  }
  
private:
  int a;
};

int main()
{
  cout << "顯示調用:" << endl;
  A a(250); //顯式調用調用普通構造函數,ok
  A b(a);   //顯式調用調用拷貝構造函數,ok
  
  //explicit構造函數隻能被顯式調用
  A c=222; //不能通過隐式轉換,error
  A d=c;   //不能通過隐式轉換,error

  return 0;  
}      

編譯時會報錯:

C++入門學習——explicit關鍵字的作用

繼續閱讀