析构函数问题

LA_Lai 2012-08-12 10:30:23
#include <iostream>
#include <string>
using namespace std;

class people
{
string name;
public:
people ();
people(string n);
~people();
void show();
};

people::people()
{
name="default";
};


people::people(string n)
{
name=n;
};

people::~people()
{
cout<<"Bye"<<endl;
}

void people::show()
{
cout<<name<<endl;
};

int main()
{
people p;
p= people("rose");
p.show();
return 0;
}


而为什么结果却是
Bye
rose
Bye
...全文
143 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
nand库路泽 2012-08-15
  • 打赏
  • 举报
回复
呵呵,师兄也过来了哈,一起学习,嘿嘿[Quote=引用 12 楼 的回复:]

引用 10 楼 helinlin007 的回复:
按照6楼的说法是,在创建了一个对象的时候,隐式调用了构造函数,默认输出“bye”,然后创建了临时的对象,输出“rose”,我也明白了点了
linlin,我也来学习一下啦~~~~
[/Quote]
yanzi1225627 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 helinlin007 的回复:]
按照6楼的说法是,在创建了一个对象的时候,隐式调用了构造函数,默认输出“bye”,然后创建了临时的对象,输出“rose”,我也明白了点了
[/Quote]linlin,我也来学习一下啦~~~~
sublimepan 2012-08-13
  • 打赏
  • 举报
回复
people p;
p= people("rose"); // 一个临时对象,析构时输出 Bye
p.show(); // 输出rose
return 0; //p析构,输出 Bye
pathuang68 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

对与复制构造函数关系不大,第一个调用相当于一个隐式的类型转换。


引用 6 楼 的回复:

引用 1 楼 的回复:

没听说过拷贝构造函数?


这个貌似和拷贝构造函数木有关系。应该是和拷贝赋值操作符有关。
C/C++ code

int main()
{
people p; // 第一次调用构造函数
p= people("……
[/Quote]

不懂不要乱说,main函数中哪有什么隐式转换。

people p = "harry";这样的写法才叫隐式类型转换。可以参考:
隐式类型转换和explicit关键字的作用
hello_kitty8888 2012-08-13
  • 打赏
  • 举报
回复
对与复制构造函数关系不大,第一个调用相当于一个隐式的类型转换。


[Quote=引用 6 楼 的回复:]

引用 1 楼 的回复:

没听说过拷贝构造函数?


这个貌似和拷贝构造函数木有关系。应该是和拷贝赋值操作符有关。
C/C++ code

int main()
{
people p; // 第一次调用构造函数
p= people("rose"); // 第二次调用构造函数,创建一个临时对象,然后调用拷贝赋值操作符,将临时……
[/Quote]
pathuang68 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

没听说过拷贝构造函数?
[/Quote]

这个貌似和拷贝构造函数木有关系。应该是和拷贝赋值操作符有关。

int main()
{
people p; // 第一次调用构造函数
p= people("rose"); // 第二次调用构造函数,创建一个临时对象,然后调用拷贝赋值操作符,将临时对象赋给p,然后析构临时对象
p.show();
return 0;
} // 函数返回前,在析构p


参考:
C++类中的4个特殊函数 - 缺省构造函数、拷贝构造函数、拷贝赋值操作符和析构函数
hello_kitty8888 2012-08-13
  • 打赏
  • 举报
回复
正解
[Quote=引用 3 楼 的回复:]

people p;
p= people("rose"); // 一个临时对象,析构时输出 Bye
p.show(); // 输出rose
return 0; //p析构,输出 Bye
[/Quote]
freelancer_ex 2012-08-13
  • 打赏
  • 举报
回复
你的构造函数又没打印,自然是先看到析构了临时对象
nightkids_008 2012-08-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

对与复制构造函数关系不大,第一个调用相当于一个隐式的类型转换。


引用 6 楼 的回复:

引用 1 楼 的回复:

没听说过拷贝构造函数?


这个貌似和拷贝构造函数木有关系。应该是和拷贝赋值操作符有关。
C/C++ code

int main()
{
people p; // 第一次调用构……
[/Quote]
听玄机的。。。不懂的不要误人子弟,这个问题玄机已经给你解答了。
另外给你一点建议:你的带参构造函数people(string n);最好用引用,不然又有临时对象,而且在函数内部用=去赋值,不如用初始化列表people(string& n):name(n)//调用string拷贝构造。
nand库路泽 2012-08-13
  • 打赏
  • 举报
回复
按照6楼的说法是,在创建了一个对象的时候,隐式调用了构造函数,默认输出“bye”,然后创建了临时的对象,输出“rose”,我也明白了点了
futurepi 2012-08-13
  • 打赏
  • 举报
回复
p= people("rose"); 构造了一个临时对象, 然后通过赋值操作符赋值给p, 析构了临时对象
LA_Lai 2012-08-12
  • 打赏
  • 举报
回复
有,但有什么联系呢
taodm 2012-08-12
  • 打赏
  • 举报
回复
没听说过拷贝构造函数?

64,654

社区成员

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

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