記事のディレクトリ
初期化リスト:
開始とコロンに続く、データメンバのコンマ区切りリストは、各メンバ変数は括弧内の最初の値または式が続きます。
例えば:
class Date
{
public:
Date(int year, int month, int day): _year(year), _month(month), _day(day)
{
}
private:
int _year;
int _month;
int _day;
};
1.各メンバー変数は初期化リストに1回だけ表示できます(初期化は1回だけ初期化できます)
2。初期化リストには、参照メンバー変数、constメンバー変数、デフォルトコンストラクターのないカスタムメンバーの3種類のメンバーを初期化する必要があります。
3.初期化リストを使用して初期化を試みます。これは、初期化リストを使用するかどうかに関係なく、カスタムタイプのメンバー変数については、最初に初期化リストを使用して初期化する必要があるためです。
4.クラス内のメンバー変数の宣言順序は、初期化リスト内の初期化順序であり、初期化リスト内の順序とは関係ありません。
次のコードについて考えてみます。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class A {
public:
A(int a):a1(a),a2(a1)
{
cout << a1 << " " << a2 << endl;
}
private:
int a2;
int a1;
};
int main()
{
A a(1);
return 0;
}
出力結果:
a1 = 1、a2はランダムな値です。
単一パラメーターコンストラクターの明示的なキーワードの暗黙的な型変換
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class A {
public:
A(int a) :_a(1)
{
cout << "A()" << endl;
}
private:
int _a;
};
int main()
{
A obj1(1);
A obj2 = obj1;
A obj3 = 20;
return 0;
}
上記のコードを読み、18行目を見てください。整数20を直接使用して、クラスAのオブジェクトobj3を初期化します。これは非論理的ですが、このコードはコンパイラーで正常に実行できます。これは、コンパイラが内部で最適化されているためです。このステートメントを実行すると、コンパイラは最初に名前のない一時オブジェクトを整数20で初期化し、次に一時オブジェクトを使用してobj3に値を割り当てます。この現象は単一パラメータコンストラクタと呼ばれます。暗黙的な型変換。(注:コンパイルして渡すことができるのは、1パラメーターのコンストラクターのみです!!!)
では、この問題をどのように解決するのでしょうか?
ここでは、明示的なキーワードを紹介します。コンストラクターを定義するときは、この状況を回避するために、関数名の前に明示的なキーワードを追加してください。