• 全部
...

关于拷贝构造函数以及重载等号的问题

ilovett 2003-08-06 12:40:23
#include <iostream.h>

class A
{
public:
A(){}
A(A& a){cout << "copy constructor"<<endl;}
A operator = (A a)
{
cout << "override ="<<endl;
return a;
}
};

void main()
{
A a;
A b;
b = a;
}

程序运行显示:
copy constructor
override =
copy constructor


请问为什么有这三个结果,能给我一一解释一下吗?
...全文
给本帖投票
729 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyd 2003-08-06
  • 打赏
  • 举报
回复
先调用了operator = (A a),在这调用了A(A& a),return a;以后,又调用了一次A(A& a),因为返回的是一个对象,而不是引用
season11 2003-08-06
  • 打赏
  • 举报
回复
楼上说的很对
xiaoyunet 2003-08-06
  • 打赏
  • 举报
回复
在纠正你的一个小错误,
A operator = (A a)
{
cout << "override ="<<endl;
return a;
}
override应该为overload,这里是函数的重载,可不是多态的覆盖。
xiaoyunet 2003-08-06
  • 打赏
  • 举报
回复
当函数的参数和返回值以值传递的方式进行时,会调用对象的拷贝构造函数,所以
标准的赋值运算符的申明是:
A& operator(const A&);

拷贝构造函数的声明是:
A(const A&);

你的赋值运算符函数采用值传递参数和返回值,严重浪费。
fixopen 2003-08-06
  • 打赏
  • 举报
回复
你的赋值运算符重载严重性能浪费,应该

A& operator = (A& a);

还有,你的拷贝构造函数形式也欠妥,应该

A(const A& a);
maxcai 2003-08-06
  • 打赏
  • 举报
回复
两次进出函数operater=传值的调用了A(A& a)这是关键的
Wendydd 2003-08-06
  • 打赏
  • 举报
回复
三次分别是:

1.参数的传值拷贝
2.字符串输出
3.返回值的传值拷贝
zkxz 2003-08-06
  • 打赏
  • 举报
回复
这三行都是在程序运行到 b=a 这一句时产生的,为方便说明将这里的a用a1代表。
第一行 copy constructor:
将 b=a1 中的a1传入 A operator=(A a) 函数的参数 a 中,此时系统要用a1(类型为A)构建参数 a ,于是调用构造函数 A(A& a){cout << "copy constructor"<<endl;}

第二行 override =:
系统执行到等号重载函数
A operator = (A a)
{
cout << "override ="<<endl;
return a;
}
中的cout << "override ="<<endl;这一句,于是在屏幕显示:“override =”

第三行 copy constructor:
系统执行到等号重载函数中return a;这一句,将 a 的值返回。返回后该值被传给
b=a1中的 b ,此时系统又用该值(类型为A)构造对象b,所以又调用构造函数
A(A& a){cout << "copy constructor"<<endl;}
jyfcsdn 2003-08-06
  • 打赏
  • 举报
回复
A operator = (A a)
{
cout << "override ="<<endl;
return a;
}
当调用b = a;实际是b.operator=(a);
由于函数是以传值方式传参数,所以要调用一次copy construcor,
然后进入函数内部,答应override =
然后函数以传值方式传返回值,所以又要调用一次copy construcor。
maxcai 2003-08-06
  • 打赏
  • 举报
回复
A a;
A b;
这两个调的是没有参数的constructor A(){}

maxcai 2003-08-06
  • 打赏
  • 举报
回复
楼上讲的对

65,187

社区成员

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

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

手机看
关注公众号

关注公众号

客服 返回
顶部