应对复制构造函数
1. 允许C++复制对象
在面向对象编程中,复制对象是一项常见的任务。C++提供了一种特殊的构造函数——复制构造函数,用于创建对象的副本。复制构造函数的形式为 X::X(const X&)
,其中 X
是类的名字。这意味着复制构造函数接受一个类对象的常量引用作为参数。
考虑以下函数调用:
void fn(Student s) {
//... whatever fn() does ...
}
void someOtherFn() {
Student s;
fn(s);
}
在这个例子中, someOtherFn()
创建了一个 Student
对象,并将该对象的副本传递给 fn()
。默认情况下,C++通过值传递对象,这意味着它必须创建对象的一个副本以传递给被调用的函数。创建对象的副本意味着创建一个新的对象,而这个过程需要调用构造函数。复制构造函数的参数是对原始对象的引用,因此它能够访问并复制原始对象的所有数据成员。
2. 创建自己的复制构造函数
默认的复制构造函数通常执行的是浅复制(shallow copy),即逐成员复制