临时对象由编译器在编译过程中“悄悄”创建(往往是为了某些特殊操作),并在适当时候销毁;它并不出现在源代码中,开发人员并没有声明要使用它,没有为其声明变量。临时对象的产生,程序的性能会下降,因为对象的创建和销毁对程序的性能影响很大。临时对象一般产生于两种场合:
1、实际调用函数时,传入的参数与函数定义中声明的变量类型不匹配;编译器提供的自动类型转换虽然提高了程序的可读性,但这样意味着临时对象的产生;为了阻止临时对象的产生,可以在类的构造函数前增加explicit声明,阻止自动类型的转换。
2、当一个函数返回的是某个非内建类型的对象时(局部对象或者全局对象)。这时返回结果必须(一个对象)必须要有一个地方存放,所以编译器会从调用该函数的函数栈帧中开辟空间,并用返回值作为参数调用该对象所属类型的拷贝构造函数,并在此空间生成对象。
#include <iostream>
using namespace std;
class Rational {
friend const Rational operator+(const Rational &a, const Rational &b);
public:
Rational (int a = 0, int b = 1):m(a), n(b) {
cout << "Rational::Rational (int, int) "<< endl;
}
Rational (const Rational &r):m(r.m), n(r.n) {
cout << "Rational::Rational(const Rational &r) " << endl;
}
Rational & operator= (const Rational r) {
if(this == &r) {
return *this;
}
m = r.m;
n = r.n;
cout << "Rational::operator = (const Rational &r) " << endl;
return *this;
}
private:
int m;
int n;
};
const Rational operator+(const Rational &a, const Rational &b) {
cout << "operator +() begin" << endl;
Rational temp;
temp.m = a.m + b.m;
temp.n = a.n + b.n;
cout << "operator +() end" << endl;
return temp; //函数执行到此处,temp对象被销毁
}
int main() {
Rational r, a(10, 10), b(5,8);
r = a + b;
return 0;
}

当一个函数的返回值为一个类的对象时,如果在调用函数中没有定义一个对象来接收这个返回对象值,那么会返回一个临时对象来保存返回的对象值,在被调函数结束时,这个临时对象被销毁;而当调用函数中有一个接受对象时,就将返回对象赋值给接收对象,这个返回对象在调用函数结束时调用析构函数。
[实验室网络不太好,服务器连不上,所以两段代码都是在windows的VS 2005下编译运行的,其中下面的这段代码在GCC下面编译好像会报错]
#include <iostream>
using namespace std;
class B {
public:
B():data(0) {
cout << "default constructor " << data <<endl;
}
~B() {
cout << "destructed by parameter " << data <<endl;
}
B(int i):data(i) {
cout << "constructed by parameter " << data <<endl;
}
B(B &b) {
data = b.data;
cout << "coped by parameter " << data <<endl;
}
B & operator = (const B &b) {
this->data = b.data;
cout << "= by parameter " << data << endl;
return *this;
}
private:
int data;
};
B play(B b) {
return b;
}
int main () {
play(1);//没有对象来接收函数返回的对象值
B t1 = play(2);//用t1来接收函数返回的对象值
B t2;
t2 = play(3);
return 0;
}

关于C++临时对象,推荐一本很不错的图书《C++应用程序性能优化》,我最近一直在看。
部分章节可在线阅读:http://book.51cto.com/art/201006/203566.htm
另:A a; a = foo(a);即对象作为参数进行值传递时,也会调用拷贝构造函数创建临时对象,如下:
#include <iostream>
using namespace std;
class A {
public:
A() {cout << "A created." << endl;}
A(A & a) {cout << "A created with copy." << endl;}
~A() {cout << "A distroyed." << endl;}
};
A foo(A a) {
A b;
return b;
}
int main () {
A a;
a = foo(a);
return 0;
}
