| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 361 人关注过本帖
标题:求教复制构造函数的问题
只看楼主 加入收藏
xingbo2293
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2010-10-22
结帖率:33.33%
收藏
已结贴  问题点数:20 回复次数:2 
求教复制构造函数的问题
#include<iostream.h>

class human
{
public:
    static int human_num;
    human()
      {
        human_num++;
      }
    ~human()
      {
        human_num--;
        print();
      }
    human(human &h)
    {
        human_num++;
        cout<<"copy construction"<<endl;
    }

    void print()
    {
        cout<<"human_num is:"<<human_num<<endl;
    }
};

int human::human_num=0;

human f1(human x)
{
    cout<<"what"<<endl;
    x.print();
    return x;
}

int main()
{
    human h1;
    h1.print();
    human h2=f1(h1);
   
    return 0;
}
输出结果为:
human_num is:1
copy construction//f1()函数形参传递时调用的复制构造参数
what
human_num is:2
copy construction//return 时调用的复制构造参数
human_num is:2//f1()子函数临时变量的析构
human_num is:1//h2的析构
human_num is:0//h1的析构
但是如果把主函数修改为:
int main()
{
    human h1;
    h1.print();
    f1(h1);
   
    return 0;
}
结果还是上面的结果:这点我不明白
human_num is:1
copy construction
what
human_num is:2
copy construction
human_num is:2
human_num is:1
human_num is:0

求大侠指导,...

搜索更多相关主题的帖子: return public include void 
2011-03-10 11:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9032
专家分:54066
注 册:2011-1-18
收藏
得分:20 
很正确呀

唯一的差别,前者是
human_num is:1//h2的析构
human_num is:0//h1的析构
后者是
human_num is:1//f1返回值(此时它是个匿名对象)的析构
human_num is:0//h1的析构

这么讲吧,第一段代码中 h2 是函数返回时,即 h2 的生命期结束时,被析构
第二段代码中 f1返回值(此时它是个匿名对象) 是那条语句结束时,即 匿名对象 的生命期结束时,被析构

如果用代码表示,第一段为
    h1.print();
    human h2=f1(h1);
    return 0;
第二段为
    h1.print();
    { human h2=f1(h1); }
    return 0;

2011-03-10 12:13
xingbo2293
Rank: 1
等 级:新手上路
帖 子:11
专家分:5
注 册:2010-10-22
收藏
得分:0 
回复 2楼 rjsp
就是说,虽然f1()函数没有把值传递给一个定义的类,但是系统已默认了有一个匿名对象,对吧?哈啊哈...谢谢啊
2011-03-10 12:39
快速回复:求教复制构造函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023598 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved