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++老師陳宗權*/
對於C++中返回一個對象建立一個臨時對象的問題
用下面的代碼實驗:
#include<iostream>
using namespace std;
class A{
public:
A(){cout<<"constructor"<<endl;}
};
A f()
{
A a;
cout<<"函數即將返回"<<endl;
return a;
}
void main()
{
A b;
cout<<"即將進入函數"<<endl;
f();
}
結果:
constructor
即將進入函數
constructor
函數即將返回
可見臨時對象貌似不調用建構函式
(VC6.0)
樓下的說的“每執行個體化一個對象就會調用建構函式”是對
但f()函數中執行個體一個對象a時調用了
但return語句時創造了個臨時對象 卻沒調用
我想應該僅僅是記憶體的複製吧
java 小問題: 為何選B 而不是C?不是先構造一個臨時對象,然後把這個;臨時對象賦給t?詳解……
問程式會列印什麼。
Test t = new Test(2);
這裡傳一個 int 類型的 2 進去當然調用 一個有參數 建構函式 public Test( int i )
列印 non-default