【C++】コピーコンストラクタ呼び出しタイミング②(関数引数としてのオブジェクト値 | 関数戻り値としてのオブジェクト値)

ブログの概要:

「コピー コンストラクター」は「代入コンストラクター」とも呼ばれ、このタイプのコンストラクターには 4 つの呼び出し機会があります。

  • ① あるオブジェクトを使用して別のオブジェクトを初期化する: クラス インスタンス オブジェクトを使用して別のクラス インスタンス オブジェクトを初期化します。
	// 使用一个对象初始化另外一个对象
	// 直接手动 调用拷贝构造函数
	Student s2 = Student(s1);
  • ② あるオブジェクトを別のオブジェクトに代入する: クラス インスタンス オブジェクトを別のクラス インスタンス オブジェクトに代入します。
	// 将一个对象赋值给另外一个对象
	// 自动调用拷贝构造函数
	Student s2 = s1;
  • ③ 関数パラメータとしてのオブジェクト値: クラスのインスタンス オブジェクトは、ポインタや参照の形式ではなく、値の形式で関数に渡されます。
// 定义函数, 接收 Student 对象值作为参数
void fun(Student s)
{
    
    
}
  • ④ 関数の戻り値としてのオブジェクト値:関数は 、ポインタや参照ではなく、クラスのインスタンス オブジェクト値を直接返します。
// 定义函数, 返回 Student 对象值作为返回值
Student fun()
{
    
    
	Student s1(18, 170);
	return s1;
}




1. コピーコンストラクターの概念




C++ 言語のコピー コンストラクターは、C++ クラスの特別なコンストラクターです。

その機能は、既存のインスタンス オブジェクトのコピーとして新しいクラス インスタンス オブジェクトを作成することです。

コピー コンストラクターの主な機能は、新しく作成されたオブジェクトを初期化して、その内容が元のオブジェクトとまったく同じになるようにすることです。






2. 関数パラメータとしてのオブジェクト値




1. コピーコンストラクタ呼び出し状況の説明


クラスのインスタンス オブジェクトは、ポインターや参照ではなく、値によって関数に渡されます。


この場合、オブジェクト値ではなく、クラスのインスタンス オブジェクト値がパラメータとして使用されます。

  • オブジェクトポインタ
  • オブジェクト参照

関数 void fun(Student s) を定義します。この関数の仮パラメータは Student 型オブジェクトです。


// 定义函数, 接收 Student 对象值作为参数
void fun(Student s)
{
    
    
}

この関数を呼び出す場合は、実際のパラメータをコピーし、実際のパラメータのコピー値、つまりオブジェクト値を関数パラメータに渡す必要があります。このプロセスでは、Student クラスのコピー コンストラクターを呼び出す必要があります。

操作全体は C++ コンパイラーによって完了され、開発者による手動介入は必要ありません。


2. コード例 - 関数パラメータとしてのオブジェクト値


コード例:

#include "iostream"
using namespace std;

class Student
{
    
    
public:
	Student(int age, int height)
	{
    
    
		m_age = age;
		m_height = height;
		cout << "调用带参数构造函数" << endl;
	}

	Student(const Student& s)
	{
    
    
		m_age = s.m_age;
		m_height = s.m_height;
		cout << "调用拷贝构造函数" << endl;
	}

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

// 定义函数, 接收 Student 对象值作为参数
void fun(Student s)
{
    
    
	
}

int main()
{
    
    
	// 调用带参数构造函数
	Student s1(18, 170);

	// 类对象值作为函数参数
	fun(s1);


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

の結果:

  • まず、Student s1(18, 170) はパラメータ化されたコンストラクターを呼び出して Student クラス インスタンス オブジェクトを作成します。
  • 次に、作成したインスタンス オブジェクトを fun 関数に渡します。オブジェクトの値が渡されるため、オブジェクトのコピーが必要です。コピーをコピーすると、Student クラスのコピー コンストラクターが自動的に呼び出されます。
调用带参数构造函数
调用拷贝构造函数
Press any key to continue . . .

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





3. 関数の戻り値としてのオブジェクトの値




1. コピーコンストラクタ呼び出し状況の説明


この関数は、ポインタや参照を返すのではなく、クラスのインスタンス オブジェクト値を直接返します。


次のコードは、関数内で作成された Student クラス インスタンス オブジェクトを返す関数を定義します。

// 定义函数, 返回 Student 对象值作为返回值
Student fun()
{
    
    
	Student s1(18, 170);
	return s1;
}

関数のスコープが終了するとスタック メモリが解放され、スタック メモリ内の Student オブジェクトも破棄されるため、Student 型の戻り値はコピーを返す必要があり、このコピーは呼び出しによって作成される必要があります。コピーコンストラクター。


2. コード例 - 関数の戻り値としてのオブジェクト値


コード例:

#include "iostream"
using namespace std;

class Student
{
    
    
public:
	Student(int age, int height)
	{
    
    
		m_age = age;
		m_height = height;
		cout << "调用带参数构造函数" << endl;
	}

	Student(const Student& s)
	{
    
    
		m_age = s.m_age;
		m_height = s.m_height;
		cout << "调用拷贝构造函数" << endl;
	}

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

// 定义函数, 返回 Student 对象值作为返回值
Student fun()
{
    
    
	Student s1(18, 170);
	return s1;
}

int main()
{
    
    

	// 类对象值作为函数返回值
	fun();


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

の結果:

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

おすすめ

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