C++ 拷贝构造函数与赋值运算符:深拷贝与浅拷贝辨析
学习目标
掌握拷贝构造函数与赋值运算符的定义及调用场景,理解深拷贝与浅拷贝的本质区别,能够在实际开发中避免内存泄漏与野指针问题。
学习重点
- 拷贝构造函数的触发条件
- 浅拷贝的缺陷
- 深拷贝的实现方法
- 赋值运算符的重载原则
一、拷贝构造函数的概念与触发场景
结论:拷贝构造函数是一种特殊的构造函数,用于通过一个已存在的对象创建一个新对象,其参数必须是本类对象的常量引用(const 类名&)。
1.1 拷贝构造函数的语法格式
class Person {
public:
// 普通构造函数
Person(参数列表);
// 拷贝构造函数
Person(const Person& other);
};
注意事项:
- 拷贝构造函数的参数必须是常量引用,使用
const防止实参被修改,使用引用避免无限递归调用拷贝构造函数。 - 如果没有手动定义拷贝构造函数,编译器会自动生成一个默认拷贝构造函数,实现简单的成员变量值拷贝。
1.2 拷贝构造函数的触发条件
拷贝构造函数在以下三种场景下会被自动调用:
- 使用一个对象初始化另一个新对象
- 函数参数为类对象(值传递)
- 函数返回值为类对象(值传递)
1.2.1 代码演示:触发场景验证
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
string name;
int age;
// 普通构造函数
Person(string n, int a) : name(n), age(a) {
cout << "普通构造函数被调用" << endl;
}
// 拷贝构造函数
Person(const Person& other) {
this->name = other.name;
this->age = other.age;
cout << << endl;
}
};
{
cout << << p.name << endl;
}
{
;
p;
}
{
;
Person p2 = p1;
(p1);
Person p3 = ();
;
}


