如下代码,算上对象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;
}
C++关于临时对象和析构函数的问题
答案:1 悬赏:30 手机版
解决时间 2021-02-28 07:14
- 提问者网友:蓝莓格格巫
- 2021-02-27 15:30
最佳答案
- 五星知识达人网友:上分大魔王
- 2021-02-27 16:05
的确只有三次啊,
第一次是在:str obj1(s1);
第二次是在:str obj2(s2);
第三次是在:obj1+obj2;
str operator+(const str& s1,const str& s2) 内部的那次 str obj(s) 的时候; 因为现代编译器一般都是默认打开返回值优化(ROV)的,所以在局部变量返回时不会再做拷贝构造,生成另外一个临时变量。你可以查看你用的编译器文档,关闭返回值优化,你就可以看到4次了。
然后 obj1=obj1+obj2; 调用了一次拷贝运算,并不是拷贝构造。
第一次是在:str obj1(s1);
第二次是在:str obj2(s2);
第三次是在:obj1+obj2;
str operator+(const str& s1,const str& s2) 内部的那次 str obj(s) 的时候; 因为现代编译器一般都是默认打开返回值优化(ROV)的,所以在局部变量返回时不会再做拷贝构造,生成另外一个临时变量。你可以查看你用的编译器文档,关闭返回值优化,你就可以看到4次了。
然后 obj1=obj1+obj2; 调用了一次拷贝运算,并不是拷贝构造。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯