拷贝构造函数和赋值构造函数的区别,不解之处。

verlongan 2005-04-05 10:02:55
class String
{
private:
char *data;
public:
String()
{
data = new char [10];
};
String(const String &);
String &operator = (const String &);
};

String::String(const String &rs)
{
if(this != &rs)
{
data = new char[10];
strcpy(this->data, rs.data);
}
//return *this;这行书上没有写,有必要用吗?
}

String &String::operator=(const String & rs)
{
if(this != &rs)
{
delete[]data;
data = new char[10];
strcpy(this->data, rs.data);
}
return *this;
}



int main(int argc, char* argv[])
{
String s1;
String s2(s1); //调用拷贝构造
String s3 = s1; //还是调用拷贝构造,为什么不调用赋值=
return 0;
}
通常拷贝和赋值构造函数都是一齐出现的,但感觉都是一样的代码,C++有必要这样做吗?
...全文
918 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhousqy 2005-04-05
  • 打赏
  • 举报
回复
String c = b; //也是调用拷贝构造函数

String c;
c = b;//这才是调用operator =
楼上有误
=====
是嗎,學習。
whyglinux 2005-04-05
  • 打赏
  • 举报
回复
>> String s3 = s1; //还是调用拷贝构造,为什么不调用赋值=

这是因为这里的“=”不是运算符。它只是一种形式上规定的分隔符。
mymyal123 2005-04-05
  • 打赏
  • 举报
回复
学习
nickshen 2005-04-05
  • 打赏
  • 举报
回复
String c = b; //也是调用拷贝构造函数

String c;
c = b;//这才是调用operator =
楼上有误
langzi8818 2005-04-05
  • 打赏
  • 举报
回复
星星~~好快~
kobefly 2005-04-05
  • 打赏
  • 举报
回复
steedhorse(晨星) ( ) 信誉:119

正解
学习,我也不明白,测试了一下,是楼主说的结果

原来如此
晨星 2005-04-05
  • 打赏
  • 举报
回复
C++语言支持两种语法形式的初始化,就是上面的两种。
注意,
String s3 = s1;

String s3;
s3 = s1;
不同。这里则是首先调用默认构造函数初始化s3,然后使用拷贝赋值从s1那里进行拷贝。而你的例子中s2和s3的构造过程都没有执行国默认构造函数。

至于为什么不同,不为什么,这就是语法,就好比循环要使用while和for,分支要使用if和switch一样,不能混用。
zhousqy 2005-04-05
  • 打赏
  • 举报
回复
String a;
String b(a); // invoke 拷贝构造函数
String c = b; // invode 赋值构造函数
晨星 2005-04-05
  • 打赏
  • 举报
回复
你只需要记住,在C++语言里,
String s2(s1);
String s3 = s1;
只是语法形式的不同,意义是一样的,都是定义加初始化,都调用拷贝构造函数。

64,651

社区成员

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

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