注册 登录
编程论坛 C++教室

求教复制构造函数的问题

xingbo2293 发布于 2011-03-10 11:44, 361 次点击
#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

求大侠指导,...

2 回复
#2
rjsp2011-03-10 12:13
很正确呀

唯一的差别,前者是
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;

#3
xingbo22932011-03-10 12:39
回复 2楼 rjsp
就是说,虽然f1()函数没有把值传递给一个定义的类,但是系统已默认了有一个匿名对象,对吧?哈啊哈...谢谢啊
1