返回物件,無非兩種方式,返回棧物件和堆物件指標,棧物件指標不能返回,因為可能使用不該使用的記憶體,堆物件也不能直接返回,因為會產生記憶體洩漏。下面,我們分析兩種返回方式的優缺點,及針對缺點的解決方案。
這裡有個注意點,返回this指標指向的自身物件時,可以返回引用。
返回棧物件:
優點:不用手動釋放記憶體,避免了記憶體洩漏;
缺點:會產生物件拷貝,如果物件比較大,比如,物件裡面有大陣列,會產生效能開銷。
返回堆物件指標:
優點:不會產生物件拷貝,對效能友好;
缺點:函式呼叫之後手動釋放物件,**管理難度和記憶體洩漏風險提高。
那有沒有辦法,把上面的缺點全克服了呢?有!
返回棧物件:用移動建構函式減少大物件拷貝;
返回堆指標:借助智慧型指標,避免記憶體洩漏。
注意:返回棧物件時,雖然很多編譯器做了編譯優化,即使不寫移動建構函式,也不會產生物件拷貝,但是,為了應對還沒有編譯優化的編譯器,建議寫好移動建構函式。
可以看下面**。
#include using namespace std;
class a
//這樣返回會造成記憶體洩漏
a getainstance4()
//這樣返回會使用不該使用的記憶體,造成程式執行不穩定
a* getainstance5()
int main(int argc, const char * ar**)
C 返回物件
使用const引用的常見原因在於提高效率。方式1vector max const vector v1,const vector v2 方式2 const vector max const vector v1,const vector v2 這裡需要注意三點 首先,返回物件將會呼叫複製建構函式,而返回...
C 返回物件和返回引用
最大的區別在於,返回物件的話會在記憶體中根據返回的型別開闢一塊區域,用返回的值對該記憶體進行初始化,如果是返回的物件,利用拷貝構造來初始化這個區域,但是這塊區域並沒有名字,就是說之後使用者沒辦法訪問到這個區域,也成為無名變數,它只能在接下來的 中進行一次性的用途,要不作為引數傳遞,或者將值列印,再之...
C 返回物件和返回引用
我們發現,在c 中,有些成員函式返回的是物件,而有些函式返回的又是引用。返回物件和返回引用的最主要的區別就是函式原型和函式頭。car run const car 返回物件 car run const car 返回引用 返回物件會涉及到生成返回物件的副本。因此,返回物件的時間成本包括了呼叫複製建構函式...