2013-10-19 37 views
1

我想確保自己在GetConnections方法中返回connections的確切副本。我將在現有節點之外進行編輯,如果它返回指向內存位置的指針(從而編輯節點的矢量),我的程序很可能會停止運行。我如何確保自己我正在返回克隆/副本而不是指針?確保返回值不是指針

std :: vector<NodeConnection*> Node :: GetConnections() 
{ 
    return this->connections; 
} 


class Node { 
    private: 
     std :: vector <NodeConnection*> connections; 
    public: 
     // getters 
     std :: vector <NodeConnection*> GetConnections(); 
}; 

在載體本身的NodeConnection*不會被修改,所以在這裏不是問題。

+1

你沒有返回一個指針,你正在返回一個副本。 – 0x499602D2

回答

2

你可以告訴你的是通過看函數簽名返回什麼:

  1. SomeType* functionName(ArgType arg) - 該函數返回一個指針。無論指針指向什麼都可以由調用者修改。
  2. SomeType const * functionName(ArgType arg) - 該函數返回指向const的指針。無論指針指向什麼都可以被檢查,但不能被調用者修改。
  3. SomeType& functionName(ArgType arg) - 該函數返回一個引用。無論參考引用是什麼,都可以由調用者修改。
  4. const SomeType& functionName(ArgType arg) - 函數返回const參考。無論引用是參考引用都可以被檢查,但不能被調用者修改。
  5. SomeType functionName(ArgType arg) - 該函數返回一個副本。調用者對返回值所做的任何修改都不會反映在要返回的原始文件上。

你的函數的返回類型是第五類返回類型 - 你是按值返回的,也就是說你的代碼創建了指針向量的副本。應該注意的是,雖然調用者不能修改類中的向量,但他們當然可以調用向量元素指向的對象的方法。如果其中一些方法對項目進行了更改,則原始矢量中的項目也會看到這些更改。換句話說,當你複製一個指針向量時,你會得到一個副本。

另外請注意,如果您想要的只是防止修改,則不需要返回副本:返回指向constconst引用的指針將獲得效率更高的相同結果,因爲可以避免副本。

+0

在這種情況下,我需要該副本,所以第五種類型將做的最好。詳細的解釋非常感謝 – bas