急!C++调用默认构造函数,创建一个临时对象问题

alice_2860 2009-09-18 10:31:27
#include <iostream.h>

class human

{

public:

human(){ human_num++;};

static int human_num;

~human()

{

human_num--;

print();

}

void print()

{

cout<<"human num is: "<<human_num<<endl;

}

protected:

private:

};

int human::human_num = 0;

human f1(human x)

{

x.print();

return x;

}

int main(int argc, char* argv[])

{

human h1;

h1.print();

human h2 = f1(h1);

h2.print();

return 0;

}

输出:

1

1

0

0

-1

-2

在退出f1函数时,要销毁X,调用析构函数(human_num--),输出:"human is 0"(由于该函数返回一个human 对象,所以又调用默认构造函数,创建一个临时对象(human_num =0;),把临时对象赋给h2,又调用默认构造函数( human_num = 0);
请问下因为函数要返回一个human对象,就调用默认构造函数,创建临时对象,是因为return X;这句来调用并创建的吗??? 还有为什么吧临时对象赋给h2时调用的是默认构造函数??而不是赋值构造函数???
请三个问题都回答下,谢谢!


...全文
296 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞天御剑流 2009-09-18
  • 打赏
  • 举报
回复
问下因为函数要返回一个human对象,就调用默认构造函数,创建临时对象,是因为return X;这句来调用并创建的吗??? 还有为什么吧临时对象赋给h2时调用的是默认构造函数??而不是赋值构造函数???
请三个问题都回答下,谢谢!
-------------------------------------------------
f1返回的临时对象不是由默认构造函数来创建的,是用复制构造函数创建的。

那个临时对象初始化h2时使用的不是默认构造函数,而是复制构造函数。


human h2 = f1(h1);这个是初始化,不是赋值,所以不使用赋值运算符重载函数。
oLINo 2009-09-18
  • 打赏
  • 举报
回复
返回一个局部对象是没有意义的,出了作用域已经被销毁了
borefo 2009-09-18
  • 打赏
  • 举报
回复
1.调用的是默认拷贝构造函数
2.是
3.调用的是默认拷贝构造函数
liangchencf 2009-09-18
  • 打赏
  • 举报
回复
human f1(human x)

{

x.print();

return x;

}
能这么写么?
alice_2860 2009-09-18
  • 打赏
  • 举报
回复
rookieXB谢谢了
rookieXB 2009-09-18
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
class human
{
public:
human(){ human_num++;print();}
human(const human& rhs){human_num++;print();}
static int human_num;
~human()
{
human_num--;
print();
}
void print()
{
cout <<"human num is: " <<human_num <<endl;
}

protected:
private:
};

int human::human_num = 0;

human f1(human x)
{
return x;
}

int main(int argc, char* argv[])
{
human h1;
human h2 = f1(h1);
return 0;
}

写一个显式的拷贝构造函数,lz运行一下应该就知道运行机理了。单步一下,就可以了,我也是新学,呵呵
结果是:
1
2
3
2
1
0
我用的是mingw-g++编译器,版本不太清楚,反正挺新的,code::block自带的。
rookieXB 2009-09-18
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
class human
{
public:
human(){ human_num++;};
static int human_num;
~human()
{
human_num--;
print();
}
void print()
{
cout <<"human num is: " <<human_num <<endl;
}

protected:
private:
};

int human::human_num = 0;

human f1(human x)
{
x.print();
return x;
}

int main(int argc, char* argv[])
{
human h1; //调用human构造函数
h1.print(); //打印:1
human h2 = f1(h1);//完成一下动作:
//1 调用默认拷贝构造函数,参数传入
//2 在f1中打印:1
//3 创建临时对象,调用默认拷贝构造函数并初始化h2
//4 离开f1,销毁函数内对象,调用析购函数,打印 0
h2.print(); //打印 0
return 0;
} //销毁h1,h2,调用两次析构函数。

给lz整理了一下代码,呵呵,应该就是注释中的动作了,楼下请补充。

alice_2860 2009-09-18
  • 打赏
  • 举报
回复
4楼 能帮我解释下为什么有两个0啊,第一个1是h1.print()打印的,第二个也是1,是因为f1是值传递,所以是h1的副本,不会调用构造函数。第一个0是因为销毁X调用析构函数。从这里开始到第二个0打印的详细调用过程,能说下吗

64,652

社区成员

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

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