【发布时间】:2020-08-02 18:11:19
【问题描述】:
我想问的是,当我没有显式编写任何复制构造函数时,编译器会自动生成默认执行浅拷贝的复制构造函数,对吗? 因此,在 main() 程序中,当我更改整数 a、b 和指针 p 的值时,只有 p 的值发生了变化,而复制的对象中 a 和 b 的值保持不变。为什么 a & b 的值也没有改变?我的代码是:
#include <iostream>
#include <string.h>
using namespace std;
class Dummy {
private:
int a, b;
int *p;
public:
Dummy() {
p = new int;
}
void setData(int x, int y, int z) {
a = x;
b = y;
*p = z;
}
void showData() {
cout << "a = " << a << " b = " << b;
cout << " p = " << *p << endl;
}
~Dummy() {
delete p;
}
};
int main() {
Dummy d1;
d1.setData(3, 4, 5);
Dummy d2 = d1;
d1.showData();
d2.showData();
d1.setData(6, 7, 8);
d1.showData();
d2.showData();
return 0;
}
我的程序的输出是:
a = 3 b = 4 p = 5
a = 3 b = 4 p = 5
a = 6 b = 7 p = 8
a = 3 b = 4 p = 8
我的意思是,当我更改对象 d1 的值时,对象 d2 的指针发生了变化,那么为什么对象 d2 的 a & b 的值也没有变化?
我也在析构函数中使用 delete 关键字来删除动态分配的指针:
~Dummy() {
delete p;
}
但它反而使我的程序崩溃了。这是为什么呢?
【问题讨论】:
-
@overhaul_ 因为你复制了它们。显然,如果您复制某些内容然后更改原件,则副本不会更改。
-
@overhaul_ 这就是copy这个词的正常含义。
-
@overhaul_ 当初学者无法理解指针时,几乎总是因为它们混淆了两个不同的东西,指针的值和它所指向的东西的值。这就是你正在做的事情。您的代码复制了指针,但随后更改了它指向的值。这就是为什么您会看到
a、d和p的行为有所不同的原因。 -
@overhaul_ 是的,因为您的两个对象具有相同的指针值,您最终会删除相同的指针两次。这通常会导致崩溃。为避免这种情况,您应该遵循 David C Rankin 给出的关于三规则的参考。
标签: c++ pointers copy-constructor deep-copy shallow-copy