一、拷贝构造函数调用时机




C++ 语言中的 拷贝构造函数 是 C++ 类中的 特殊构造函数 ,

其作用是 创建一个新的 类实例对象 , 作为现有实例对象的 拷贝后的副本 ;

拷贝构造函数 的 主要作用 是初始化新创建的对象 , 使其内容与原对象完全相同 ;


" 拷贝构造函数 " 又称为 " 赋值构造函数 " , 该类型构造函数有 4 种调用时机 ;

  • 使用 一个 类实例对象 初始化 另外一个 类实例对象 ;
	// 使用一个对象初始化另外一个对象
	// 直接手动 调用拷贝构造函数
	Student s2 = Student(s1);
  • 将 一个 类实例对象 赋值给 另外一个 类实例对象 ;
	// 将一个对象赋值给另外一个对象
	// 自动调用拷贝构造函数
	Student s2 = s1;
  • 类的实例对象 以值的方式 传递给函数 , 不是以 指针 或 引用 的方式 ;
  • 函数直接返回类的实例对象 值 , 不是返回 指针 或 引用 ;




二、使用一个对象初始化另外一个对象




1、拷贝构造函数调用情况说明


使用 一个 类实例对象 初始化 另外一个 类实例对象 会 自动调用 拷贝构造函数 ;

	// 使用一个对象初始化另外一个对象
	// 直接手动 调用拷贝构造函数
	Student s2 = Student(s1);

在下面的代码中 , 直接 手动 调用了 Student(const Student& s) 拷贝构造函数 , 将一个已存在的 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;	// 身高
};

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

	// 使用一个对象初始化另外一个对象
	// 直接手动 调用拷贝构造函数
	Student s2 = Student(s1);


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

执行结果 : 执行时 , 先调用了 带参构造函数 创建第一个实例对象 , 然后手动调用 拷贝构造函数 将 第一个实例对象 作为参数传递给该函数 , 这是手动调用 拷贝构造函数 ;

调用带参数构造函数
调用拷贝构造函数
Press any key to continue . . .

【C++】拷贝构造函数调用时机 ① ( 使用一个对象初始化另外一个对象 | 将一个对象赋值给另外一个对象 )-LMLPHP





三、将一个对象赋值给另外一个对象




1、拷贝构造函数调用情况说明


将 一个 类实例对象 赋值给 另外一个 类实例对象 ;

	// 将一个对象赋值给另外一个对象
	// 自动调用拷贝构造函数
	Student s2 = s1;

下面的代码中 , 将 Student s1(18, 170) 对象 赋值给了 Student s2 对象 ;

可以使用 构造函数 的 等号法调用 理解 , 相当于调用了 Student(const Student& s) 构造函数 ;


使用 等号 = 进行赋值操作 , 与初始化 是 完全不同的两个概念 ;


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;	// 身高
};

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

	// 将一个对象赋值给另外一个对象
	// 自动调用拷贝构造函数
	Student s2 = s1;


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

执行结果 : 执行时 , 先调用了 带参构造函数 创建第一个实例对象 , 然后将 第一个实例对象直接赋值给 第二个实例对象 , 期间会自动调用 拷贝构造函数 ;

调用带参数构造函数
调用拷贝构造函数
Press any key to continue . . .

【C++】拷贝构造函数调用时机 ① ( 使用一个对象初始化另外一个对象 | 将一个对象赋值给另外一个对象 )-LMLPHP

09-14 08:53