了解复制构造函数和引用

Understanding the copy constructor and references

本文关键字:引用 构造函数 复制 了解      更新时间:2023-10-16

我在复制构造函数和引用的概念方面遇到了麻烦:

这是我找到的一个例子:

class Person {
private: 
string *name;
int age;
public: 
Person(string name, int age) {
this -> name = new string(name);
this -> age = age;
}
}

我对代码的理解如下:构造函数被赋予参数nameage。在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 是一个现有变量,它不是引用!

我把它提炼成你的实际问题:

但是在这项任务中会发生什么?如果调用复制构造函数,则 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(,因此它可以执行所有必要的复制,无论是深的还是浅的。