为什么为什么为什么?c++高手请进

【例3-5】Example是一个人员信息类。用普通构造函数生成obj1,用拷贝构造函数生成obj2。include<iostream>usingnamespacestd;... 【例3-5】 Example是一个人员信息类。用普通构造函数生成obj1,用拷贝构造函数生成obj2。
include <iostream>
using namespace std;
class Example{
private:
char *name; int num;
public:
Example(int i, char *str ) { // 构造函数定义
name=new char[strlen(str)+1];
strcpy(name,str); num=i;
}
~Example( ){ delete[] name); }
Example(const Example &x) // 拷贝构造函数定义
{ num=x.num; name=new char[strlen(x.name)+1];
strcpy(name,x.name);} //如果去掉该拷贝构造函数,则有问
//题,因为析构时,delete对同一空间name释放了两次
void list(void) { // 定义显示函数list
cout<<"\n数据成员num的值="<<num<<endl<<endl;
cout<<"name:"<<name<<endl; }
};
void main (void){
Example obj1(215, "张立三");
Example obj2(obj1); //使用拷贝构造函数构造obj2
obj2.list(); //显示obj2的值
}
问题:为什么说如果去掉该拷贝构造函数,则有问
//题,因为析构时,delete对同一空间name释放了两次
展开
 我来答
yxz0539
2010-08-29 · TA获得超过1597个赞
知道大有可为答主
回答量:1759
采纳率:0%
帮助的人:1877万
展开全部
注意 Example obj2(obj1); 这是用obj1对象构建obj2对象
如果没有定义拷贝构造函数,C++编译器会提供一个默认的构造函数,这时候这两个对象的name指针会指向同一个内存空间。因为这个类定义了析构函数释放这个指针,当obj1的生命周期结束的时候,name所在的内存空间会被释放,而这时obj2的name指针会指向这个已经释放了的内存空间,当你再使用obj2的name指针或者试图释放它的时候就会出错。所以我们提供一个拷贝构造函数来让它执行拷贝的时候重新为obj2分配内存(new)。当我们提供这个拷贝构造函数时,编译器就不会为你提供默认拷贝构造函数的了。
不知道我说的你看没看懂。详细内容楼主可以参阅有关书籍
詹柔美
2010-08-29
知道答主
回答量:2
采纳率:0%
帮助的人:0
展开全部
没有问题吧!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
墨夷忆之0Ga5af
2010-08-29 · 超过24用户采纳过TA的回答
知道答主
回答量:102
采纳率:0%
帮助的人:0
展开全部
因为默认的拷贝函数只是简单的复制
在遇到指针时
简单复制会使得两个指针指到同一地址 同一地址当然不能释放两次
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式