explicit關鍵字【C++】

White_ink發表於2024-11-26

image

explicit關鍵字【C++】

用來修飾只有一個引數的類建構函式,以表明該建構函式是顯式的,而非隱式的
禁止類物件之間的隱式轉換,以及禁止隱式呼叫複製建構函式

隱式型別轉換

int i = 1;
double d = i;

d被i賦值時
【編譯器會做】
在中間產生一個臨時變數
再透過這個臨時物件進行複製構造給d

建構函式具有型別轉換的作用

class Date
{
public:
// 建構函式
	Date(int year)
		:_year(year)    // 初始化列表
	{}

private:
	int _year;
	int _month = 3;
	int _day = 31;
};
int main()
{
    // d1 和 d2 都會呼叫建構函式
	Date d1(2022);
	Date d2 = 2023;
	return 0;
}

Date d2 = 2023;發生了隱式型別轉換
image

如果做引用
Date& d3 = 2024;報錯
image
原因:d3是一個Date型別,2024則是一個內建型別的資料

const Date d2 = 2023;可正常執行傳值
原因:臨時變數具有常性,它就是透過Date類的建構函式構造出來的,同型別之間可以做引用

explicit的作用:【禁止型別轉換】

對於可讀性不是很好的程式碼,可以使用explicit修飾建構函式,將會禁止建構函式的隱式轉換,禁止隱式呼叫複製建構函式

只在類的建構函式前進行修飾

explicit Date(int year)
	:_year(year)
{}

const Date d2 = 2023;會報錯

多參情況

Date(int year, int month ,int day = 31)
	:_year(year)
	,_month(month)
	,_day(day)
{}

這兩種都可正常呼叫
Date d2 = { 2023, 3 };
const Date& d3 = { 2024, 4 };

若加入explicit

explicit Date(int year, int month ,int day = 31)
	:_year(year)
	,_month(month)
	,_day(day)
{}

則不可正常呼叫

相關文章