【C++】コンストラクタ初期化リスト③(コンストラクタ初期化リストはconstメンバ変数の初期化)


コンストラクター初期化リストの概要:

  • 初期化リストは、クラスのメンバー変数の初期値を提供できます。
  • 初期化リストは、クラスのメンバー変数型のコンストラクターを呼び出してメンバー変数を初期化できます。
  • 初期化リストでは、コンストラクターで渡されたパラメーターを使用できます。
  • クラスが初期化されるとき、定義順序に従って、メンバー変数のコンストラクターが最初に呼び出され、次に外部クラスのコンストラクターが呼び出され、デストラクターはその逆になります。
  • インスタンス オブジェクトの const メンバー変数は初期化リスト内でのみ初期化する必要があり、すべてのコンストラクターも初期化する必要があります。




1. コンストラクタの初期化リスト内のconstメンバ変数の初期化




1. const 定数メンバの初期化


const によって変更されたメンバー変数がクラスで定義されている場合、そのメンバー変数を初期化する必要があります。初期化しないとエラーが報告されます。

オブジェクト内の Const メンバーは、宣言の直後に初期化する必要があります。

const メンバーの初期化は、コンストラクターの初期化リストを通じてのみ初期化できます。

注:ここでは、初期化と割り当てが区別されます。

  • 初期化とは、変数の宣言時にその変数の初期値を設定することを意味します。
  • 代入とは、宣言後に変数に値を代入することです。

const メンバー変数は定数であり、宣言後に割り当てることはできないため、const メンバー変数はコンストラクターの初期化リストで割り当てる必要があります。


2. エラーコードの例 - 定数メンバーが初期化されていません


次のクラス B では、定数 const int m_const_int が定義されています。

定数が初期化されていない場合、コンパイルおよび実行時にエラーが報告されます。

class B
{
    
    
public:
	B() : m_age(10), m_a(10, 150)
	{
    
    }

	// 构造函数中的参数可以作为 参数列表 中的参数值
	B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA)
	{
    
    
		cout << "执行 B 的构造函数" << endl;
	}

	~B()
	{
    
    
		cout << "执行 B 的析构函数" << endl;
	}
public:
	int m_age;		// 年龄
	A m_a;			// A 类型成员变量
	const int m_const_int;	// 常量成员
};

の結果:

已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>hello_world.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(29,2): error C2789: “B::m_const_int”: 必须初始化常量限定类型的对象
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(44): message : 参见“B::m_const_int”的声明
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(33,2): error C2789: “B::m_const_int”: 必须初始化常量限定类型的对象
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\hello_world.cpp(44): message : 参见“B::m_const_int”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

コンパイル中に、すべてのコンストラクターでエラーが報告されます。

すべてのコンストラクターで、定数メンバーは初期化リストで初期化する必要があります。

ここに画像の説明を挿入します


3. 正しいコード例 - 初期化リストの定数メンバーを初期化する


次のクラス B では、すべてのコンストラクターで、定数メンバーの初期化に初期化リストを使用する必要があります。コンストラクターが省略され、定数メンバーが初期化されていない限り、エラーが報告されます。


コード例:

class B
{
    
    
public:
	B() : m_age(10), m_a(10, 150), m_const_int(888)
	{
    
    }

	// 构造函数中的参数可以作为 参数列表 中的参数值
	B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA), m_const_int(888)
	{
    
    
		cout << "执行 B 的构造函数" << endl;
	}

	~B()
	{
    
    
		cout << "执行 B 的析构函数" << endl;
	}
public:
	int m_age;		// 年龄
	A m_a;			// A 类型成员变量
	const int m_const_int;	// 常量成员
};

の結果:

ここに画像の説明を挿入します


4. 完全なコード例


完全なコード例:

#include "iostream"
using namespace std;

class A
{
    
    
public:
	// 带参构造函数
	A(int age, int height)
	{
    
    
		m_age = age;
		m_height = height;
		cout << "执行 A 的构造函数" << endl;
	}

	~A()
	{
    
    
		cout << "执行 A 的析构函数" << endl;
	}

public:
	int m_age;		// 年龄
	int m_height;	// 身高
};

class B
{
    
    
public:
	B() : m_age(10), m_a(10, 150), m_const_int(888)
	{
    
    }

	// 构造函数中的参数可以作为 参数列表 中的参数值
	B(int age, int ageOfA, int heightOfA) : m_age(age), m_a(ageOfA, heightOfA), m_const_int(888)
	{
    
    
		cout << "执行 B 的构造函数" << endl;
	}

	~B()
	{
    
    
		cout << "执行 B 的析构函数" << endl;
	}
public:
	int m_age;		// 年龄
	A m_a;			// A 类型成员变量
	const int m_const_int;	// 常量成员
};


int main()
{
    
    
	// 通过 B 的有参构造函数
	// 其中 构造函数中的参数 作为 参数列表 中的参数值
	B b(10, 10, 150);


	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
}

の結果:

执行 A 的构造函数
执行 B 的构造函数
Press any key to continue . . .
执行 B 的析构函数
执行 A 的析构函数

D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Debug\HelloWorld.exe (进程 20756)已退出,代码为 0
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

ここに画像の説明を挿入します

Supongo que te gusta

Origin blog.csdn.net/han1202012/article/details/133015280
Recomendado
Clasificación