标题:[求助]关于复制构造函数深复制的问题
只看楼主
ljhwahaha
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-3-13
 问题点数:0 回复次数:10 
[求助]关于复制构造函数深复制的问题
这是从课本时抄下来的代码,关键看红色那一行,我想问这句 pName[0]='\0'; 究竟有什么意义呢?? 这样做不会影响delete的执行吗?

Name::Name(char *pn)
{
cout<<"Constructing"<<pn<<endl;
pName=new char[strlen(pn)+1];
if(pName!=0)
strcpy(pName,pn);
size=strlen(pn);
}
Name::Name(const Name &Obj)
{
cout<<"Copying"<<Obj.pName<<"into its own block\n";
pName=new char[strlen(Obj.pName)+1];
if(pName!=0)
strcpy(pName,Obj.pName);
size=Obj.size;
}
Name::~Name()
{
cout<<"Destructing"<<pName<<endl;
pName[0]='\0';
delete []pName;
pName=NULL;
size=0;
}
搜索更多相关主题的帖子: 函数 构造 pName Obj 
2007-03-19 19:26
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
得分:0 
还有代码没//

Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-03-19 19:39
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
mark!

看不出来!

Fight  to win  or  die...
2007-03-19 20:08
ljhwahaha
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-3-13
得分:0 

其他部分就是类说明和main函数,是这样的

#include<iostream>
#include<string.h>



class Name
{
public:
Name (char *pn);
Name(const Name& Obj);
~Name();
private:
char *pName;
int size;
};
void f();

int main()
{
f();

}

2007-03-19 23:36
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 
以下是引用ljhwahaha在2007-3-19 19:26:35的发言:
这是从课本时抄下来的代码,关键看红色那一行,我想问这句 pName[0]='\0'; 究竟有什么意义呢?? 这样做不会影响delete的执行吗?

Name::Name(char *pn)
{
cout<<"Constructing"<<pn<<endl;
pName=new char[strlen(pn)+1];
if(pName!=0)
strcpy(pName,pn);
size=strlen(pn);
}
Name::Name(const Name &Obj)
{
cout<<"Copying"<<Obj.pName<<"into its own block\n";
pName=new char[strlen(Obj.pName)+1];
if(pName!=0)
strcpy(pName,Obj.pName);
size=Obj.size;
你输入\0做数据,这个很典型
pName[0]='\0';
他先用‘\0’构造一个Name类
然后执行复制构造
但是由于你这个是\0
strcpy()和strlen无法正常工作
所以你需要考虑你的复制构造函数的强壮性
不会再问
}
Name::~Name()
{
cout<<"Destructing"<<pName<<endl;
pName[0]='\0';
delete []pName;
pName=NULL;
size=0;
}


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-03-20 08:10
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

你输入\0做数据,这个很典型
pName[0]='\0';
他先用‘\0’构造一个Name类
然后执行复制构造
但是由于你这个是\0
strcpy()和strlen无法正常工作
所以你需要考虑你的复制构造函数的强壮性

你说的'\0'做参数进去,也就是""做参数(char *)传进去
即便这样也不会印象strcpy和strlen的正常工作吧~!
无非是strlen("")==0;strcpy复制了0个字节过去,并在结尾加个'\0',也就是this->pName[0]='\0';
而后strlen(this->pName)==0;没有影响的


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-03-20 22:52
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
我想问这句 pName[0]='\0'; 究竟有什么意义呢?? 这样做不会影响delete的执行吗?
我认为pName[0]='\0';要不要没多大关系。但是不影响delete.

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-03-20 22:56
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 
呵呵
一个函数内容为'\0'
SIZE为0
别人会你认为这个类他初始化了么??
不会象C里面那么相信程序员吧
如果谁用了TRY,那肯定会有问题
那些函数能工作到是能工作
但是没有意义的工作,非我们正常时的工作目的
设计的没有考虑‘\0’问题

我睡了,太累了
晚安

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-03-20 23:21
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

那些函数能工作到是能工作
但是没有意义的工作,非我们正常时的工作目的
我们判断和strcpy、strlen所做的代码行数都一样的问题.
你也知道strlen和strcpy的代码,无非就是循环,如果一开始'\0',他们什么也不做,而我们要加检查'\0'也算是多此一举了。对这个类没有影响。


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-03-20 23:36
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 

确实没影响
但是不够强壮


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2007-03-21 10:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-125223-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.559114 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved