程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++入門學習——explicit關鍵字的作用

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

編輯:C++入門知識

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


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

 

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

 

#include 
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 << 
隱式轉換: << endl;
	A c=222; //隱式轉換成調用普通構造函數,ok
	A d=c;   //隱式轉換成調用拷貝構造函數,ok

	return 0;	
}

編譯運行結果如下:

 

/

 

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

 

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

 

示例代碼如下:

 

#include 
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;	
}

編譯時會報錯:

 

/

 

普通構造函數能夠被隱式調用。而explicit構造函數只能被顯式調用。

通常,除非有明顯的理由想要定義隱式轉換,否則,單形參構造函數應該為 explicit。將構造函數設置為explicit可以避免錯誤,並且當轉換有用時,用戶可以顯式地構造對象。

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved