C++ 拷贝构造函数与赋值运算符:深拷贝与浅拷贝辨析
在 C++ 开发中,对象的生命周期管理是核心难点之一。很多内存泄漏和野指针问题,根源都在于对拷贝构造函数和赋值运算符的理解不够深入。今天我们就来聊聊这两个概念,以及它们背后的深拷贝与浅拷贝机制。
一、拷贝构造函数的概念与触发场景
拷贝构造函数是一种特殊的构造函数,它的作用是用一个已存在的对象来初始化一个新对象。它的参数必须是本类对象的常量引用(const 类名&)。
1. 基本语法
class ClassName {
public:
// 普通构造函数
ClassName(参数列表);
// 拷贝构造函数
ClassName(const ClassName& other);
};
这里有两个关键点需要注意:
- 参数类型:必须是常量引用。用
const是为了防止修改实参,用引用则是为了避免无限递归调用拷贝构造函数本身。 - 默认行为:如果你没有手动定义,编译器会生成一个默认的拷贝构造函数,它执行的是简单的成员变量值拷贝。
2. 什么时候会被调用?
在实际开发中,以下三种情况会自动触发拷贝构造函数:
- 使用一个对象初始化另一个新对象。
- 函数参数为类对象(值传递)。
- 函数返回值为类对象(值传递)。
代码验证
我们通过一个简单的 Person 类来看看这些场景是如何触发的。
#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& other) {
->name = other.name;
->age = other.age;
cout << << endl;
}
};
{
cout << << p.name << endl;
}
{
;
p;
}
{
;
Person p2 = p1;
(p1);
Person p3 = ();
;
}


