文章目录
- 一、拷贝构造函数调用时机
- 二、使用一个对象初始化另外一个对象
- 1、拷贝构造函数调用情况说明
- 2、代码示例 - 使用一个对象初始化另外一个对象
- 三、将一个对象赋值给另外一个对象
- 1、拷贝构造函数调用情况说明
- 2、代码示例 - 将一个对象赋值给另外一个对象
一、拷贝构造函数调用时机
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 . . .
三、将一个对象赋值给另外一个对象
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 . . .