对象作为函数返回值问题
源代码:
#include <iostream>
#include <cstring>
using namespace std;
class NAME
{
public:
NAME(){cout < < "constructing.\n ";string=new char[80];}
NAME(const NAME &obj){cout < < "copy constructing.\n ";string=new char[80];strcpy(string,obj.string);}
~NAME(){cout < < "destructing.\n ";if(string!=NULL) delete string;}
void show(){cout < <string < < "\n ";}
void set(char *s){string=new char[strlen(s)+1];strcpy(string,s);}
private:
char *string;
};
NAME get_name()
{
NAME temp;
char temp_str[250];
cin> > temp_str;
temp.set(temp_str);
return temp;
}
int main()
{
NAME my;
my=get_name();
my.show();
return 0;
}
运行结果是:
constructing.
constructing.
aaaaa
destructing.
destructing.
我用的是vs2005,书上说当对象作为函数返回值,会创建一个临时对象并用拷贝函数初始化,函数调用结束后就被撤销.但运行结果却没调用拷贝函数,是不是并没有创建临时对象啊?我把这两个语句my=get_name();my.show();改为get_name().show();后可以输出aaaaa,但依然没调用拷贝函数,拷贝函数的其中一个用途不是用来生成一个临时对象作为函数返回结果吗?
[解决办法]
你差一个operator=
有一个东西叫做返回值优化.
[解决办法]
加上函数
NAME& operator=( const NAME& OBJ )
{
cout < < "AAAAAAAA constructing.\n ";
string=new char[80];
strcpy(string,OBJ.string);
return *this;
}