一道C++的笔试题,关于拷贝构造函数的

netfirstman 2009-10-18 04:02:22
class X
{
public:
X()
{
cout<<"1"<<endl;
}
X(const X&){cout<<"2"<<endl;}
X&operator=(const X& b){cout<<"3"<<endl; return *this;}
~X(){cout<<"4"<<endl;}
};
void f(X b)
{cout<<"5"<<endl;}

int main(int argc, char* argv[])
{
X a;
X b;
b=a;
f(a);
X c=b=a;
cout<<"6"<<endl;

return 0;
}


结果为
1
1
3
2
5
4
3
2
6
4
4
4
问题:c=b=a中,c直接使用了拷贝构造函数,没有使用操作符=
...全文
196 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
heis07w 2009-10-18
  • 打赏
  • 举报
回复
int main(int argc,char* argv[])
{
X a;            //默认构造,输出1
X b; //默认构造,输出1
b=a; //因为b已构造,调用operator=,输出3
f(a); //函数f传变量而非传引用,创建临时对象,调用copy constructor,输出2
//函数中输出5
//临时变量析构,输出4
X c=b=a; //b=a,因为b已构造,调用operator=,输出3
//X c=(b=a),因为c未构造,调用copy constructor,输出2
cout<<"6"<<endl;return0; //输出6
//game over,析构abc,输出4 4 4
}

结果为
1
1
3
2
5
4
3
2
6
4
4
4
coolmousewife 2009-10-18
  • 打赏
  • 举报
回复
我也问个哈:
为甚么执行f(a)函数调用时要先调用X(const X&){cout<<"2"<<endl;}呢 ???
求各位大虾帮帮忙 一直没看明白!!!
lllcccppp 2009-10-18
  • 打赏
  • 举报
回复
X c=b=a;
定义 + 初始化,用拷贝构造函数。
而a,b之前已经定义,用重载的赋值,然后最终对c来操作……
北辰猫咪 2009-10-18
  • 打赏
  • 举报
回复
不清楚,学习一下
onion923 2009-10-18
  • 打赏
  • 举报
回复
X c=b=a;是对c的定义,属于对c直接初始化,在这个这地方理所当然调用拷贝构造。
yangxb0610 2009-10-18
  • 打赏
  • 举报
回复
X c=(b=a)

b=a是赋值语句,使用重载赋值运算符,而X c=()是初始化,编译器调用复制构造函数。
pcboyxhy 2009-10-18
  • 打赏
  • 举报
回复
初始化+赋值 > 初始化

65,189

社区成员

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

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