P174-1 给出下列程序都输出结果

#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); //深拷贝  
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
C++

第三章-程序分析题-4

2023-10-19 19:53:16

C++

P173-3-2 下面的程序实现复数的加法

2023-10-22 16:43:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索