介绍
在C++中真正的临时对象是看不见的,它们不出现在我们的源代码中。建立一个没有命名的非堆(non-heap)对象会产生临时对象。这种未命名的对象通常在两种条件下产生:为了使函数成功调用而进行隐式类型转换和函数返回对象时。
临时变量通常在函数参数传递发生类型转换以及函数返回值时被创建。比如:
void uppercasify(const string& str){}int main(int argc, char* argv[]){ char subtleBookPlug[] = "Effective C++"; uppercasify(subtleBookPlug); // 此处有类型转换 return 1;}函数uppercasify需要const string&类型的参数,而实参类型为char *,故编译器会尝试着进行类型转换。此时一个string类型的临时变量将被创建,并用subtleBookPlug来初始化对象,最后将临时变量传给函数uppercasify。1
临时内存位置运算中的临时对象显然是栈内的,对于参数上的临时对象,因为是直接push进去的,所以也在栈内。对于返回值上的临时对象,函数为返回值预留了栈空间。new/malloc函数创建出来的对象则是在堆中。