关于String一个面试经典问题,偶就被卡在那里,面试失败了.

liuqingwu228 2007-08-04 09:54:38
class String
{
public:
String(const char *str=NULL)//普通的构造函数
{
if(str==NULL)//不是给m_data=NULL,而是要m_data给一个'\0'这样终结符
{
m_data=new char [1];
m_data='\0';
}
else
{
m_data=new char[strlen(str)+1];

//不能用这个来取代,因为
strcpy(m_data,str);
/*
要用下面这一段,来取代strcpy,
特别要注意m_data起始地址的保存
char *temp=m_data;
while((*m_data++=*str++)!='\0');
m_data='\0';
m_data=temp;
temp=NULL;
*/

}
}
String(const String &other)//拷贝构造函数
{
int length=strlen(other.m_data);
m_data=new char[length+1];
if(NULL==m_data)//用于判断内存是否分配成功
{
cout<<"内存分配失败!"<<endl;
}
else
{
strcpy(m_data,other.m_data);
}
//exit(1);
}
~String(void); //析构函数
//String& operate =(const String &other);//赋值函数
char *My_Mdata()
{
return m_data;
}
private:
char *m_data;
};

String::~String()
{
delete []m_data;//改成delete m_data;因为m_data不是数组指针
//m_data=NULL;
}
//为什么 m_data 是private ,但是String(const String &other)//拷贝构造函数
//int length=strlen(other.m_data);//这里other.m_data却是之间调用,难道private 不起作用了?
...全文
2784 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbgeqh 2007-08-13
  • 打赏
  • 举报
回复
study
digu 2007-08-12
  • 打赏
  • 举报
回复
回复人:trueytht(一碗阳春面) ( 一级(初级)) 信誉:100 2007-8-10 16:32:08 得分:0
?

问一下:digu(digu)

private 是类型的private -- 其他类类型不能访问该类类型的私有成员
而不是实例private -- 也就是同一类类型的不同实例之间是可以互访私有成员。
------------------------------------------------------------------
other.m_data的这个m_data难道不是它自己的吗?
你的意思是说这个m_data是this指向的那个对象的?
------------------------------------------------------------------

在这个拷贝构造函数String(const String &other)中,对于同一个类String,有两个该类的对象,*this和other。在这个类的成员函数内部,String的所有对象的成员数据都是可以直接访问的。对于调用该成员函数的类对象的成员数据,通过隐式的this指针访问,而对于其他的该类对象,则可以直接通过.或者->访问。
tmhlcwp 2007-08-12
  • 打赏
  • 举报
回复
mark
wfwsm 2007-08-10
  • 打赏
  • 举报
回复
楼上
构造函数能return ** 吗
dazhuaye 2007-08-10
  • 打赏
  • 举报
回复
有待mark~!
trueytht 2007-08-10
  • 打赏
  • 举报
回复
问一下:digu(digu)

private 是类型的private -- 其他类类型不能访问该类类型的私有成员
而不是实例private -- 也就是同一类类型的不同实例之间是可以互访私有成员。
------------------------------------------------------------------
other.m_data的这个m_data难道不是它自己的吗?
你的意思是说这个m_data是this指向的那个对象的?
shencyx 2007-08-10
  • 打赏
  • 举报
回复
支持 MoonZ_Wu(木子文武)
还是不清楚楼主问的问题本意是什么。不过我的理解是
考官可能想考考你对指针的理解,所以不让直接使用strcpy
ochinchina 2007-08-09
  • 打赏
  • 举报
回复
在构造函数中strcpy显然是可以的,在String(const String &other)中是不可以的.这个String(const String &other)写得一点都不好,应该为:

String(const String &other)//拷贝构造函数
{
if( this == &other ) return *this;

int length=strlen(other.m_data);
m_data=new char[length+1];
if(NULL==m_data)//用于判断内存是否分配成功
{
cout<<"内存分配失败!"<<endl;
}
else
{
strcpy(m_data,other.m_data);
}
}
miraclezone520 2007-08-09
  • 打赏
  • 举报
回复
mark
lgdgyd2 2007-08-09
  • 打赏
  • 举报
回复
mark
int2e 2007-08-09
  • 打赏
  • 举报
回复
回复newerC()

在下眼拙,请问阁下哪句代码释放了str的空间???
==============================================
是我测试的时候
看错了
sorry
herman~~ 2007-08-08
  • 打赏
  • 举报
回复
private 成员在类的成员函数内部可以
newerC 2007-08-08
  • 打赏
  • 举报
回复
有人解析一下为什么不能 strcpy(m_data,str); 吗?
================================================

注意:此为构造函数,而不是字符串拷贝操作啊。
先看结果之不同:
使用strcpy(m_data,str),m_data = str = "字符串";
使用自己写的呢,m_data = "字符串";str = NULL,
明白了吧?
相当于同时将str的空间释放啊,很精妙的。
哈哈哈

====================================
在下眼拙,请问阁下哪句代码释放了str的空间???
ws7883524 2007-08-08
  • 打赏
  • 举报
回复
while((*m_data++=*str++)!='\0');
*m_data='\0';
這個m_data='\0'是多余的吧
red_berries 2007-08-08
  • 打赏
  • 举报
回复
lz来给解释一下啊
tengomi 2007-08-06
  • 打赏
  • 举报
回复
strcpy为什么不能用?
xiantongyuan 2007-08-06
  • 打赏
  • 举报
回复
代码是楼主写的吗?
为什么不能用strcpy()啊?
不明白,而且其中有多处错误!
mgtcllxl 2007-08-06
  • 打赏
  • 举报
回复
MARK下,不知道为什么
MoonZ_Wu 2007-08-06
  • 打赏
  • 举报
回复
还是不清楚楼主问的问题本意是什么。不过我的理解是
考官可能想考考你对指针的理解,所以不让直接使用strcpy
suprich 2007-08-06
  • 打赏
  • 举报
回复
高 ,偶实在是不的正解啊...........
加载更多回复(23)

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧