理解复制构造函数和引用

时间:2018-05-09 11:48:58

标签: c++

我很难理解复制构造函数的概念以及参考文献:

以下是我发现的一个例子:

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是一个现有变量,它不是引用!

1 个答案:

答案 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)的对象,因此它可以执行所有必要的复制,无论是深度还是浅度。