1. 程式人生 > >C++臨時物件減少的方法

C++臨時物件減少的方法

C++臨時物件產生的場景:

1. 值傳遞   2. 函式返回   3. 後置++ 等

減少臨時物件產生的方法:

1. 使用引用或指標傳遞

2. 避免隱式型別轉換

3. 使用 += 代替 +

string x = a + b; // 這裡會產生儲存a+b值的臨時物件
string x(a);  x += b; // 這樣就不會產生臨時物件

4. 使用前置++代替後置++

前置++的定義:  

type operator++();

後置++的定義:

const type operator++(int);

為了編譯器區分前置和後置++,C++規定字尾形式有一個int型別引數 ,當函式被呼叫時,編譯器傳遞一個0做為int引數的值給該函式。不這樣規定,無法區分,因為都僅以自身物件為入參。

class CInt {
private:
int m_value;
};

CInt & CInt:: operator++()  // 前置的是沒有引數的,並且返回引用
{
this -> m_value += 1;
return * this;
}

const CInt CInt::operator++(int)  //後置的有一個匿名引數,並且返回const值
{
CInt old = * this;
++(*this);
return old;
}

上面的例子很好的解釋了,為什麼前置比後置效率高,後置會產生臨時物件並返回原本的值的原因。

5. 使用匿名臨時物件

#include <iostream>
using namespace std;
class Teacher
{
	string name;
	string course;
public:
	Teacher(const char *n,const char *c):name(n),course(c)
	{
		cout << "建立" << course << "老師" << name <<endl;
	}
	
	Teacher(const Teacher& t)
	{
		name = t.name;
		course = t.course;
		cout << "複製" << course << "老師" << name << endl;
	}
	
	~Teacher()
	{
		cout << "辭退" << course << "老師"  << name <<endl;
	}
	
	
	
};

int main()
{
	//用臨時匿名物件來初始化一個新物件 
	//編譯器一般會優化成直接用建立臨時物件的引數來建立新物件

	Teacher t1("陳宗權","C++");//建構函式
	Teacher t2 = t1;//拷貝建構函式
	
	//少建個物件  少呼叫個拷貝建構函式
	//比較多的用的是 函式返回匿名物件 而不是有名字的臨時變數。
	Teacher t3 = Teacher("楊強","UC");//直接建立 呼叫建構函式
	
	t2 = t3; //賦值函式
	
	cout << "=======" <<endl;
	t2 = Teacher("徐薇薇","諮詢"); // 沒有優化 建立匿名物件  呼叫賦值函式 
	cout << "=======" <<endl;
	

}
/*
建立C++老師陳宗權
複製C++老師陳宗權
建立UC老師楊強
=======
建立諮詢老師徐薇薇
辭退諮詢老師徐薇薇
=======
辭退UC老師楊強
辭退諮詢老師徐薇薇
辭退C++老師陳宗權
*/