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;
發生了隱式型別轉換
如果做引用
Date& d3 = 2024;
報錯
原因: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)
{}
則不可正常呼叫