[C++] コンストラクターの意味 (明示的および暗黙的なコンストラクター呼び出し | コンストラクターの代替 - 初期化関数 | 初期化関数の欠陥 | デフォルトのコンストラクター)





1. コンストラクタ関数の意味




1. クラスコンストラクター


C++ によって提供されるコンストラクターとデストラクターは、クラス インスタンス オブジェクトの初期化および破棄ソリューションとして機能します。

クラスの複数のインスタンス オブジェクトを定義します。各オブジェクトは独立したメンバー属性を持ちます。

クラスのインスタンス オブジェクトを定義するとき、C++ コンパイラは開発者定義のコンストラクターを自動的に呼び出します。


2. コンストラクタの明示的呼び出しと暗黙的呼び出し


クラスのコンストラクターは、自動または手動で呼び出すことができます。

  • 一般に、デフォルトの引数なしのコンストラクターは暗黙的に自動的に呼び出されます。
  • パラメーター化されたコンストラクターは、開発者によって手動で明示的に呼び出されます。

3. コンストラクターの代替 - 初期化関数


コンストラクター - 初期化関数の代替:

  • 共有初期化関数:クラスごとにパブリック共有初期化関数を定義します。
  • 呼び出しのタイミング:オブジェクトの作成直後に初期化操作を実行する必要があります。

4. 初期化機能の不具合


初期化関数とコンストラクターの欠点:

  • 操作が面倒です。初期化関数は単なる一般的なパブリック関数であり、開発者が手動で呼び出す必要があり、明示的に呼び出すため、操作が面倒になります。
  • 操作漏れ: インスタンスオブジェクトの初期化には初期化関数を使用し、操作漏れがあってはなりませんインスタンスオブジェクトが初期化されていない場合、メンバー変数の値はランダムな値となり不確実で未知のリスクが発生します。
  • 呼び出すことができません: 特殊な状況では、初期化関数を呼び出すことができません。たとえば、クラスの変数型のみが定義され、コンストラクターが呼び出されない場合、パラメーターなしのコンストラクターが自動的に呼び出され、インスタンス オブジェクトを初期化します。初期化関数が使用されている場合、初期化操作を実行できません。

5. デフォルトのコンストラクター


クラスの定義時にコンストラクターが記述されていない場合、C++ コンパイラーはクラスのデフォルトのコンストラクターを提供します。

デフォルトのコンストラクターの関数本体は空であり、開発者が定義する必要はありません。デフォルトで C++ コンパイラーによって提供されます。


デフォルトのコンストラクターは 2 つのタイプに分かれています。

  • デフォルトのパラメーターなしコンストラクター:クラスにコンストラクターが定義されていない場合、C++ コンパイラーはデフォルトでパラメーターなしのコンストラクターを提供し、コンストラクターの関数本体は空になります。
  • デフォルトのコピー コンストラクター:クラスにコピー コンストラクターが定義されていない場合、C++ コンパイラーはデフォルトでデフォルトのコピー コンストラクターを定義します。これは単純なメンバー変数の割り当てに使用されます。

6. コード例 - 初期化関数の呼び出しが間に合わない


次のコードでは、Student クラスで初期化関数が定義されています。

	// 初始化函数 初始化 实例对象
	void init(int _age, int _height)
	{
    
    
		m_age = _age;
		m_height = _height;
	}

コードを使用してインスタンス オブジェクトを定義するシナリオではStudent s、初期化関数を時間内に呼び出すことができません。


コード例 - 初期化関数:

#include "iostream"
using namespace std;

class Student
{
    
    
public:
	// 初始化函数 初始化 实例对象
	void init(int _age, int _height)
	{
    
    
		m_age = _age;
		m_height = _height;
	}

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

int main()
{
    
    
	// 定义 Student 类实例对象
	// Student 类 没有提供构造函数 , C++ 编译器 会提供一个 默认构造函数
	// Student 类 没有提供拷贝构造函数 , C++ 编译器 会提供一个 默认拷贝构造函数
	Student s;
	// 调用初始化函数
	s.init(18, 170);


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

の結果:

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

おすすめ

転載: blog.csdn.net/han1202012/article/details/132823429