【发布时间】:2020-06-08 23:08:48
【问题描述】:
我定义了一个复制构造函数来避免数据成员 n 的浅拷贝,但它不起作用,当我更改 v1 时 v2 仍然在更改,我做错了什么?
#include<iostream>
using namespace std;
class Vector
{
public:
int *n;
Vector();
Vector(const Vector& vector );
};
Vector::Vector()
{
cout<<"Constructor called"<<endl;
}
Vector::Vector(const Vector& vector )
{
n=new int;
n=vector.n;
cout<<"Copy constructor called"<<endl;
}
int main()
{
Vector v1;
int x=5;
v1.n=&x;
Vector v2=v1;
cout <<"Vector v1 has n value: "<<*v1.n<<endl;
cout <<"Vector v2 has n value: "<<*v2.n<<endl;
*v1.n=499;
cout <<"Vector v1 has n value: "<<*v1.n<<endl;
cout <<"Vector v2 has n value: "<<*v2.n<<endl;
return 0;
}
【问题讨论】:
-
您有内存泄漏。存储在
v1.n中的地址正在保存到v2.n。使用new int分配的内存丢失。所以他们现在指向同一个内存。如果你只想复制整数值,你需要做*n = *vector.n。但是你不是在做一个浅拷贝。你正在做一个深拷贝。 -
您需要正确实施它。您分配 n,然后通过复制指针泄漏内存,执行默认副本的操作。您应该将 vector.n 的内容复制到您分配的内容中。例如,像这样:
*n = *vector.n。如果您实现了复制构造函数,您还应该实现 = 运算符。 -
^^^ 和析构函数。如果您感觉很奇怪,请添加移动分配和移动构造函数。
-
我应该分配内存吗?我不确定是否必须输入 'n=new int;'
-
还阅读了“三规则”或(C++ 11 及更高版本)五规则。简而言之,三法则是,如果你的类需要手动定义复制构造函数、赋值运算符或析构函数之一,则所有这些都需要定义。五规则将其扩展到包括移动构造和移动分配。
标签: c++ oop copy-constructor shallow-copy