#include <iostream> using namespace std; class pointer { public: int a; int* p; pointer() { a = 100; p = new int(10); } pointer(const pointer& tempp)//复制构造函数 { if (this != &tempp)//避免a=a这样赋值 { a = tempp.a; p = tempp.p; } } }; int main() { pointer p1;//使用默认构造函数 pointer p2(p1);//使用复制构造函数 cout << p1.a << ",\t" << *p1.p << ",\t" << (p1.p == p2.p) << endl; *p1.p = 20; p2.a = 300; cout << (p1.a == p2.a) << ",\t" << *p1.p << ",\t" << (p1.p == p2.p) << endl; /* 他们是通过复制构造函数出来的所以内存一样? 不太懂先做保留 *p = new int(10)出来的 */ return 0; }
AI回答:
你的代码定义了一个名为pointer的类,这个类包含一个整型变量a和一个整型指针p。这个类有一个默认构造函数和一个复制构造函数。在默认构造函数中,a被初始化为100,p被初始化为指向一个新分配的整型变量(值为10)。在复制构造函数中,传入的对象(tempp)的a和p的值被复制到新创建的对象中。
然后在main函数中,你创建了两个pointer对象,p1和p2。p1使用默认构造函数创建,p2使用复制构造函数从p1创建。然后输出p1的a和*p1.p的值,以及p1.p和p2.p是否相等。接着修改*p1.p和p2.a的值,再次输出一些比较结果。
关于你的问题,”他们是通过复制构造函数出来的所以内存一样?”:复制构造函数确实使得p2的a和p的值与p1相同,但这并不意味着他们的内存地址相同。实际上,他们在内存中是不同的对象。然而,因为你没有为pointer类的成员指针p编写深拷贝逻辑,所以p1.p和p2.p指向同一个内存地址,这就是你在修改*p1.p的值后,这个修改也影响到p2.p的原因。
要避免这种情况,你需要在复制构造函数中实现深拷贝,即为新的对象分配新的内存,并复制原对象指针所指向的内容,而不仅仅是复制指针本身。这样,新创建的对象将拥有自己的内存空间,不会受到原对象修改的影响。
以下是一个实现深拷贝的复制构造函数的例子:
pointer(const pointer& tempp) //复制构造函数 { a = tempp.a; p = new int(*tempp.p); //深拷贝 }