求解呀大佬们,为什么test01在创建变量p时没有使用构造函数,也没有对临时对象析构,我认为test01和test02使用的析构函数应该一样才对吧。

Analyse_Complete 2021-05-04 09:55:32
为什么test01在创建变量p时没有使用构造函数,也没有对临时对象析构,我认为test01和test02使用的析构函数应该一样才对吧。
#include<iostream>
using namespace std;

class Person
{
int m_age;

public:
Person()
{
cout << "默认构造" << endl;
}
Person(int age):m_age(age)
{
cout << "有参构造" << endl;
}
Person(const Person &p)
{
m_age = p.m_age;
cout << "复制构造函数" << endl;
}
~Person()
{
cout << "析构构造" << endl;
}
};

Person dowork()
{
Person p1;
return p1;
}

void test01()
{
Person p = dowork();

}
void test02()
{
Person p;
p = dowork();
}

int main()
{
cout << "test01 :" << endl;
test01();
cout << "test02 :" << endl;
test02();
system("pause");
return 0;
}
...全文
109 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
APX7409 2021-05-04
  • 打赏
  • 举报
回复
老哥你搞懂了也回复我一下,我也想知道为什么?谢谢了
Analyse_Complete 2021-05-04
  • 打赏
  • 举报
回复
但是test只使用了两次析构函数,它应该有局部变量p1析构,临时对象析构,还有变量p析构应该三次和test02一样才对
真相重于对错 2021-05-04
  • 打赏
  • 举报
回复
百度复制消除
狐帝 2021-05-04
  • 打赏
  • 举报
回复
对于Person p = dowork(); 编译器认为这个是个赋值语句,不会首先创建p对象,而是仅仅为p分配存储空间,因此不会调用Person的构造函数。 而对于Person p; p = dowork();,在没有任何优化的情况下,编译器认为这是两条语句,首先要调用Person构造函数创建对象p,然后又调用p = dowork()将p的原有内容覆盖掉。如果打开优化开关,编译器有可能会把这两条语句合并成一条,不过这我就吃不准了。

65,187

社区成员

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

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