C++之explicit

    C++中允許一種特殊的聲明比變量的方式。在這種情況下,可以將一個對應於構造函數參數類型的數據直接賦值給類變量。編譯器在編譯時會自動進行類轉換,將對應於構造函數參數類型的數據轉換爲類的對象。但是這種寬鬆的規則會破壞代碼的可讀性,並導致難以發現的錯誤。其實只要在構造函數前加上explicit則會禁止這種自動轉換。要注意的是explicit只對構造函數起作用。

    下面來舉例說明。

#include<iostream>
using namespace std;
class Test
{
public:
	Test(int x=1):val(x){}
	int GetVal(void){return val;}
private:
	int val;
};
main()
{
	Test t1(1);
	cout<<"t1.val="<<t1.GetVal()<<endl;
	Test t2=2;
	cout<<"t1.val="<<t2.GetVal()<<endl;
}

在以上代碼中我們發現可以把數字“2”直接發給Test類型的對象t2。這就是c++編譯器隱式轉換的結果。

然後我們在構造函數之前加上explicit:


#include<iostream>
using namespace std;
class Test
{
public:
	explicit Test(int x=1):val(x){}
	int GetVal(void){return val;}
private:
	int val;
};
main()
{
	Test t1(1);
	cout<<"t1.val="<<t1.GetVal()<<endl;
	Test t2=2;
	cout<<"t1.val="<<t2.GetVal()<<endl;
}


編譯時會出現以下錯誤:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章