C++臨時對象減少的方法,對象減少

來源:互聯網
上載者:User

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
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.