免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2364 | 回复: 9
打印 上一主题 下一主题

[C++] 问个奇怪的拷贝构造函数问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-27 14:28 |只看该作者 |倒序浏览
代码如下:

#include <iostream>
using namespace std;
&nbsp;
class A
{
&nbsp;&nbsp;&nbsp;&nbsp;private:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i;
&nbsp;&nbsp;&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A(){}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A(const A& a){ cout << "copy constructor" << endl; }    /* 构造1 */
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//A(A& a){ cout << "copy constructor" << endl; }        /* 构造2 */

};
&nbsp;
int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;A a;
&nbsp;&nbsp;&nbsp;&nbsp;a = A();
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}



如果用构造1,没有问题;如果用构造2,编译报错:
test.cpp: In function `int main()':
test.cpp:17: error: no matching function for call to `A::A(A)'
test.cpp:11: note: candidates are: A::A(A&)


可是a = A()根本就没用到拷贝构造函数啊?

论坛徽章:
0
2 [报告]
发表于 2009-07-27 16:22 |只看该作者
咋没人知道啊?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2009-07-27 17:19 |只看该作者
看得我稀里糊涂

首先,a = A();是调用赋值操作,所以和你定义的拷贝构造函数没有关系。
我用VC2005和g++3.4.5试验了一下,一点问题都没有

其次,即使是 A a = A(),也应该没问题,这是C++标准规定的,既不会去调用拷贝构造函数,更不会去调用赋值操作。
我用VC2005和g++3.4.5试验了一下,一点问题都没有

当然,写成 A(A& a) 是很不好的,因为这要求a必须是一个左值,匿名临时对象不可以

论坛徽章:
0
4 [报告]
发表于 2009-07-27 17:37 |只看该作者

回复 #3 bruceteen 的帖子

多谢bruceteen回复!
我是g++ version 3.4.3的。
还是不明白。
既然和“拷贝构造函数没有关系”,那为啥用“构造2 ”会编译不过呢?

论坛徽章:
0
5 [报告]
发表于 2009-07-27 19:51 |只看该作者
写成A a = A();会报这个错误。不明白为什么。可能和编译器的分析过程有关

[ 本帖最后由 haohao06 于 2009-7-27 20:00 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-07-27 21:55 |只看该作者
应该是编译器的问题,你用别的环境试下

论坛徽章:
0
7 [报告]
发表于 2009-07-27 22:06 |只看该作者
查了下,貌似VC6.0是可以的。
而g++在“构造2”下不支持A a=A();和A a; a=A()这种格式。
只是觉得太诡异了,按c++语法来讲,应该没问题啊!

论坛徽章:
0
8 [报告]
发表于 2009-07-27 22:36 |只看该作者
其实 A(const A& a)更安全,建议用

论坛徽章:
0
9 [报告]
发表于 2009-07-27 22:51 |只看该作者

回复 #8 aaaaa5aa 的帖子

其实一直都用A(const A& a),只是研究下为啥A(A& a)不行。:wink:

论坛徽章:
0
10 [报告]
发表于 2009-07-28 13:32 |只看该作者

回复 #9 zpp71 的帖子

顶一下,期待高手作答
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP