临时对象
临时对象经常作为算术表达式的结果出现。如求值x*y+z的中间结果x*y就是临时对象,必须存在某个地方。
除非有一个临时对象被约束到某个引用或者被用于做命名对象的初始化,否则它将总在建立它的完整表达式结束时销毁。完整表达式是指不是其他表达式的子表达式的表达式。考虑如下函数,这是个常见的错误。
void f(string& s1, string& s2, string& s3)
{
const char* cs = (s1+s2).c_str(); //在完整表达式赋值结束后,临时变量被销毁,cs变成了野指针!
cout << cs; // 错误!
if (strlen (cs =(s2+s3).c_str()) < 8 && cs[0] == ‘a‘)
{
cout << cs; //错误,理由同上
}
}
为了比避免这样的错误我们可以使用下面的方式。
void g(string& s1, string& s2, string& s3)
{
cout << (s1+s2).c_str(); // 在完整表达式cout结束时临时对象销毁,故cout可以正确输出。
string s = s2 + s3;
if(s.length() < 8 && s[0] == ‘a‘)
{
cout << s;
}
}
也可以使用临时变量作为const引用或者命名对象的初始式,例如,
void h(string& s1, string& s2)
{
const string& s = s1 + s2;
string ss = s1 + s2;
g(s, ss, s1);
}
这样的临时变量在他的引用或者命名变量离开作用域时销毁。故临时变量是一种匿名的局部变量,返回局部变量的引用是错误的。临时变量不是左值变量,不能约束到非cosnt引用。
原文:http://www.cnblogs.com/txf1949/p/4304680.html