1. 程式人生 > >返回區域性物件的引用和返回區域性物件的指標

返回區域性物件的引用和返回區域性物件的指標

在C++ primer書中有這麼一句話,“千萬別返回區域性物件的引用”與“千萬別返回區域性物件的指標”,為什麼會有這種說法呢?以下就為大家講解一下:

1.返回區域性物件的引用

string & opp(const string & name)

{

     string s;

     s = name;

     return s;

}

2.返回區域性物件的指標

string * opp(const string * name)

{

     string * s;

     *s = *name;

     reutnr s;

}

要想理解這個首先我們要知道,函式在記憶體的執行機制。

每當一個函式被呼叫的時候,系統都會將其引數和變數儲存在記憶體的一個區域,此區域是一個(stack)的結構,其中的元素按後進先出(last-in first-out)的方式存取;當一個函式呼叫另一個函式時呼叫者的棧空間被完好無缺地保留,系統會分配新的空間來處理新的函式呼叫。當一個函式完成它的工作,返回其呼叫者時,它關聯的棧空間將被釋放。

區域性物件的記憶體地址已經被釋放了,如果這時又有新建立的函式棧,那麼就會覆蓋原有的區域性物件,然後就會出錯。

也就是說,函式呼叫完之後,會銷燬臨時物件,返回引用或者指標會導致未定義的行為,無法指向區域性物件的指標,返回區域性物件的指標的唯一辦法就是建立動態物件,關鍵字new,能在記憶體裡建立新的空間(不同於函式的棧空間),處於堆中,除了用關鍵字delete來銷燬。

一般而言引用,在類型別用的廣泛,對於class a& fun()而言,返回引用就非常有用了,避免了物件的複製,物件複製牽扯到複試構造器,而複製構造器又跟基礎有聯絡,繼承再加上virtual,一系列的這些聯絡中,一個隱藏的及其不易發現的bug就有可能出現。所以,此時用返回引用就非常有用,但是,返回的不是區域性變數的引用,而是new出來的物件的引用。如

過載操作符

ofstream & operater+(const string& s, const string& t)

{

       return s + t;

}

呼叫:

string a("asd");

string b("asdsd");

cout << operater+(a, b);