了解复制构造函数和引用
Understanding the copy constructor and references
我在复制构造函数和引用的概念方面遇到了麻烦:
这是我找到的一个例子:
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 是一个现有变量,它不是引用!
我把它提炼成你的实际问题:
但是在这项任务中会发生什么?如果调用复制构造函数,则 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
(,因此它可以执行所有必要的复制,无论是深的还是浅的。
相关文章:
- 在类构造函数中传递对外部函数的引用
- 在 c++ 中将变量作为结构构造函数中的引用传递
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 移动构造函数和右值引用
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- C++:右值引用构造函数和复制省略
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 引用构造函数时链接失败
- 为什么调用转发引用构造函数而不是复制构造函数?
- 为什么使用已删除的右值引用构造函数?
- 对 std::Optional 的转发引用构造函数的约束
- 模板是否应该为不同类型的参数制作非 Rvalue 引用构造函数/赋值
- 我是否应该对非引用构造函数参数手动调用move
- 使用左值引用错误地调用了Rvalue引用构造函数
- C++未定义的引用构造函数错误
- 调用左值引用构造函数而不是右值引用构造函数
- C++引用构造函数语法
- 不能引用构造函数的地址