2013-09-05 77 views
0

返回私有變量考慮這個類:C++權的方式來存儲參考

class example 
{ 

    inline const A& GetA() 
    { 
     return _a; 
    } 

private: 
    A _a; 
}; 

用下面的代碼:

example Ex; 
A& a = Ex.GetA(); 

_a將參照未做_a的任何副本退還。

我的問題是,如果我把參考操作如下會發生什麼:

example Ex; 
A a = Ex.GetA(); 

a_a參考或_a副本將被創造出來的?

+0

你爲什麼要授予訪問內部私有變量?沒有其他解決方案嗎? – Mario

+0

@Mario,我改變了我的問題的方法是返回'const'。 – Subway

+0

我現在重新找回;-) – Mario

回答

4

如果存在可訪問的拷貝構造函數,則它將是副本,否則將是編譯錯誤。如果你聲明它是一個變量,那麼變量只是一個參考。

+0

因此,如果_a不是A而是一個stl容器,整個容器的副本將被創建? – Subway

+0

只是爲了澄清,如果你有'A a; a = Ex.GetA()'然後你調用複製賦值而不是複製構造函數。細微的差異,但重要。 – IdeaHat

+0

@Subway:是的。無論什麼類型,聲明都會產生一個新的變量,而不是一個參考;用引用初始化它將複製一份。如果是標準容器,則會複製所有內容。 –

1

在你的第二個例子中,你已經聲明瞭一個局部變量(不是引用),所以你會得到一個拷貝從你的函數返回的參考值。

那麼說:不要這樣做。通過非const引用返回的公共非const方法比複雜度爲公共成員的結構只有一小步。只需將結構與公共成員一起使用,然後直接訪問,或者正確地封裝您的數據。

+0

謝謝。我改變了我的問題的方法是返回'const'。 – Subway

0

,你可以簡單的檢查,通過這個代碼示例:

#include <iostream> 

class A { 
public: 
    A() { 
     std::cout << "Creating A from default ctor" << std::endl; 
    } 
    A(const A &) { 
     std::cout << "A copy created!" << std::endl; 
    } 
}; 

class Example { 
public: 
     inline A& getA() { 
      return _a; 
     } 

    private: 
     A _a; 
}; 

int main() { 
Example a; 
A aa = a.getA(); 

return 0; 
}