免费注册 查看新帖 |

Chinaunix

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

[C++] 请教一个C++拷贝构造函数问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-15 23:05 |只看该作者 |倒序浏览
#include <iostream>
using namespace std;

class Test
{
public:
    Test(){
        cout << "constructor"<<endl;
    }
//    Test(Test & hu){
//        cout << "copy constructor" << endl;
//    }

    ~Test(){}
};

Test fun(Test x)
{
    return x;
}
int main(void)
{
    Test h1;
    Test h2 = fun(h1);
    return 0;
}
  在上面的代码中,若将注释去掉,即自己写拷贝构造函数,则编译通不过,想了很长时间都没想明白,为什么?

[ 本帖最后由 qylhnu 于 2008-10-15 23:08 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-10-15 23:22 |只看该作者
因为fun函数返回是一个临时Test对象,对它的引用只能是const引用,而你的拷贝构造函数是非const引用(Test h2 = fun(h1);),所以不能通过编译
把你的拷贝构造函数改为const引用就行了,另外一般拷贝构造函数都写成const引用

论坛徽章:
0
3 [报告]
发表于 2008-10-15 23:34 |只看该作者
非常感谢!大概明白了。

再麻烦下,我试着同时加了有const和无const的两个版本,然后发现系统直接调用的是无const的那个版本,这是为什么呢?

论坛徽章:
0
4 [报告]
发表于 2008-10-15 23:44 |只看该作者
原帖由 qylhnu 于 2008-10-15 23:34 发表
非常感谢!大概明白了。

再麻烦下,我试着同时加了有const和无const的两个版本,然后发现系统直接调用的是无const的那个版本,这是为什么呢?

不可能吧?
你再好好确信下,或者把代码和结果贴出来

论坛徽章:
0
5 [报告]
发表于 2008-10-15 23:49 |只看该作者
#include <iostream>
using namespace std;

class Test
{
public:
    Test(){
        cout << "constructor"<<endl;
    }
    Test(const Test & hu){
        cout<<": const copy constructor" << endl;
    }
    Test(Test & hu){
        cout <<": copy constructor" << endl;
    }
    ~Test(){}

};

Test fun(Test x)
{
    return x;
}
int main(void)
{
    Test h1;
    Test h2 = fun(h1);
   
    return 0;
}
结果:
constructor
: copy constructor
: copy constructor

论坛徽章:
0
6 [报告]
发表于 2008-10-16 00:09 |只看该作者
这个我也不能很好解释,这里给出一种可能的解释:
h1->x:调用一次拷贝函数,函数重载时解析为非const版本
func(h1)->h2:这里本来有一个中间的临时对象,但从结果来看被编译器优化了(NRV,命名返回值优化),所以还是调用非const

我想产生这种似乎矛盾的结果,原因是编译器的分阶段处理造成的
当然,从实践角度来看,不应该写两个版本的,const版本已经完全够用(我还没发现需要非const版本的情景)

论坛徽章:
0
7 [报告]
发表于 2008-10-16 09:48 |只看该作者
再次感谢!还学习了“命名返回值优化”,好像优化后直接用x做参数了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP