我很难理解复制构造函数的概念以及参考文献:
以下是我发现的一个例子:
class Person {
private:
string *name;
int age;
public:
Person(string name, int age) {
this -> name = new string(name);
this -> age = age;
}
}
我理解代码如下:构造函数被赋予参数name
和age
。当在main()
函数中创建类Person的对象时,将调用构造函数并且this
返回对象的地址。我认为。现在,在此地址处,将创建变量name
,使用new
将分配必要的内存。此外,我认为,变量年龄存储在当前的内存地址。
好的,现在实现了复制构造函数:
Person(const Person &p) {
name = new string(*p.name);
age = p.age;
}
当在main()
中完成对Person类的两个对象的赋值时,将调用复制构造函数:
Person Person1(Lukas, 25);
Person Person2 = Person1;
因此,我认为这是执行深拷贝而不是浅拷贝所需要的。但是这项任务会发生什么?如果调用复制构造函数,Person1将是它的参数。这应该是一个参考。什么意思?到目前为止,我想,一个引用只是给出一个变量的别名,但在这个赋值中,Person1是一个现有变量,它不是引用!
答案 0 :(得分:0)
我把它作为你的实际问题提炼出来了:
但是这项任务会发生什么?如果调用复制构造函数,Person1将是它的参数。这应该是一个参考。什么意思?
答案实际上非常简单。你提到过:
我想,一个引用只是给出一个变量的别名
这是正确的。考虑:
int x = 42;
int& y = x;
cout << y; // prints 42
它的功能相同:
int x = 42;
void print(int& y) {
cout << y;
}
print(x); // prints 42
由于复制构造函数只是一个特殊的函数,它的工作方式是相同的:
Person a;
Person b = a;
// Inside:
Person(const Person& p) {
// p is an alias for "a"
// "this" is referencing "b"
}
构造函数有一种方法可以访问从(通过ref参数)复制的对象和复制到(通过this
)的对象,因此它可以执行所有必要的复制,无论是深度还是浅度。