コンセプト紹介
コンストラクターはオブジェクトを構築して初期化できるだけでなく、単一のパラメーターまたは最初のパラメーターを除くデフォルト値を持つコンストラクターの型変換関数も備えています。
Explicit キーワードを使用すると、コンパイラの暗黙的な型変換を正確に禁止できます。
1.明示的な導入
明示的な役割は、クラス コンストラクターが暗黙的ではなく明示的に呼び出されることを宣言することです。
単一パラメータのコンストラクタを変更する理由は何ですか?
パラメーターなしのコンストラクターと複数パラメーターのコンストラクター自体は明示的に呼び出されるため、明示的に追加する意味はありません。
1.1 明示的呼び出しと暗黙的呼び出し
class Date
{
public:
// 1.无参构造函数
Date()
{
cout << "无参调用构造函数" << endl;
}
//2. 单参构造函数
Date(int year)
:_year(year)
{
cout << "单参数调用构造函数" << endl;
}
//Date(int year, int month = 1, int day = 1)
// :_year(year)
// ,_month(month)
// ,_day(day)
//{
// cout << "多参构造函数调用" << endl;
//}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
Date d1(1); // 直接调用构造函数
Date d2 = 1; //隐是调用:隐式类型转换:构造+拷贝构造+优化 -> 直接调用构造
return 0;
}
明示的呼び出し: 直接の明示的呼び出し (パラメーターなしのコンストラクターを呼び出す Date d1、または単一パラメーターのコンストラクターを呼び出す Date d1(1) など)。
暗黙的な呼び出し: 直接呼び出さない場合、コンパイラーが自動的に呼び出します。たとえば、Date d2 = 1 の場合、単一パラメーターのコンストラクターが暗黙的に呼び出されます。
1.2 明示的な意味
上記の数式呼び出しは、int 型のデータを Date 型に直接代入しているように見えますが、この種のコードは暗黙の型変換を行っています。表面上はエラーが発生していませんが、後からプログラムでエラーが発生した場合、トラブルシューティングが困難になります。エラー。
したがって、この暗黙的な変換によって引き起こされる可能性のあるリスクを防ぐためには、単一パラメータのコンストラクターを明示的に呼び出すことを宣言する、つまり暗黙的な呼び出しを禁止し、明示的に追加する必要があります。次のように:
ここから、明示的に暗黙的な変換を禁止し、プログラムをより堅牢にすることがわかります。