C++中的临时对象

    临时对象由编译器在编译过程中“悄悄”创建(往往是为了某些特殊操作),并在适当时候销毁;它并不出现在源代码中,开发人员并没有声明要使用它,没有为其声明变量。临时对象的产生,程序的性能会下降,因为对象的创建和销毁对程序的性能影响很大。临时对象一般产生于两种场合:

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值