永发信息网

C++关于临时对象和析构函数的问题

答案:1  悬赏:30  手机版
解决时间 2021-02-28 07:14
如下代码,算上对象obj1,obj2,函数中的局部变量obj,还有返回的时候产生的临时对象的析构一共有四次才对,为什么只有三次呢?
#include<iostream>
#include<string.h>
#include<math.h>

using namespace std;

class str
{
public:
int len;
char *p;
int flag=-1;

str()
{
len=0;
p=NULL;
}
str(char* s)
{
len=strlen(s);
p=new char[len];
strcpy(p,s);
}
str(const str& obj)
{
len=obj.len;
p=new char[len];
strcpy(p,obj.p);
}
~str()
{
cout<<"析构:"<<endl;
delete []p;
}
friend str operator + (const str& s1,const str& s2);
void show()
{
cout<<"length="<<" "<<p<<endl;
}
};
str operator+(const str& s1,const str& s2)
{
int l;
char s[30];
l=s1.len+s2.len;
strcpy(s,s1.p);
strcat(s,s2.p);
str obj(s);
obj.flag=0;
return obj;

}

int main()
{

char s1[100],s2[100];
cin>>s1>>s2;
str obj1(s1);
obj1.flag=1;
str obj2(s2);
obj2.flag=2;

obj1=obj1+obj2;

return 0;
}
最佳答案
的确只有三次啊,
第一次是在:str obj1(s1);
第二次是在:str obj2(s2);
第三次是在:obj1+obj2;
str operator+(const str& s1,const str& s2) 内部的那次 str obj(s) 的时候; 因为现代编译器一般都是默认打开返回值优化(ROV)的,所以在局部变量返回时不会再做拷贝构造,生成另外一个临时变量。你可以查看你用的编译器文档,关闭返回值优化,你就可以看到4次了。

然后 obj1=obj1+obj2; 调用了一次拷贝运算,并不是拷贝构造。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
问一下 就是我和我对象最近不知道怎么了 彼此
家庭教师里面的七的三次方是什么意思
iphone6丢了有成功找回的案例吗?找回的几率
松下3匹空调柜机通电源自动开机是哪里故障?
宏耐地板和大卫地板的强化板哪个好?
求集成块的脚功能
求喜剧之王七叔唱的歌粤语版
玻璃幕墙工程施工时,可以在施工现场进行注胶
《神魄》破天石对战是怎么回事?求详解!
小米手机之前因硬件问题不支持关机闹铃最近一
章丘眼镜总店在哪里啊,我有事要去这个地方
我是女生,送给比较好的女生朋友送什么生日礼
如果人体中白细胞的数量突增,有可能是因为身
五菱荣光,车载的播放器的,那个优盘播放歌曲
初中地理生物物理哪本辅导书好
推荐资讯
广州火车站搬迁期间正常发车吗
民生寄卖怎么去啊,有知道地址的么
美卿村我想知道这个在什么地方
大家来看看嫩江有什么特产
高楼地下车库起火会不会把整栋楼烧塌
世嘉三厢邮箱怎么开启操作示意图
北京和合康源冀州市体验店地址在什么地方,想
信誉便民超市我想知道这个在什么地方
有了光盘怎么修复电脑?
放狗的意思是
黔这个字怎么读?
有现在就读山东农业大学电气专业的研究生吗?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?