[C ++の基本知識]初期化リスト、単一パラメーターコンストラクターの暗黙的な型変換

初期化リスト:

開始コロンに続く、データメンバのコンマ区切りリストは、各メンバ変数は括弧内の最初の値または式が続きます。

例えば:

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パラメーターのコンストラクターのみです!!!)

では、この問題をどのように解決するのでしょうか?

ここでは、明示的なキーワードを紹介します。コンストラクターを定義するときは、この状況を回避するために、関数名の前に明示的なキーワードを追加してください。

おすすめ

転載: blog.csdn.net/weixin_43962381/article/details/114373258