我想确保自己在GetConnections
方法中返回connections
的精确副本。我将在现有Node之外编辑它,如果它返回指向内存位置的指针(因此编辑节点的向量),我的程序很可能会停止运行。我怎样才能确保自己返回克隆/副本而不是指针?
std :: vector<NodeConnection*> Node :: GetConnections()
{
return this->connections;
}
class Node {
private:
std :: vector <NodeConnection*> connections;
public:
// getters
std :: vector <NodeConnection*> GetConnections();
};
矢量本身中的NodeConnection*
将不会被编辑,因此这不是问题所在。
答案 0 :(得分:2)
通过查看函数签名,您可以告诉您返回的内容:
SomeType* functionName(ArgType arg)
- 该函数返回一个指针。无论指针指向什么,都可以被调用者修改。SomeType const * functionName(ArgType arg)
- 该函数返回指向const
的指针。可以检查指针指向的是什么,但调用者无法修改。SomeType& functionName(ArgType arg)
- 该函数返回一个引用。无论参考引用是什么,都可以由调用者修改。const SomeType& functionName(ArgType arg)
- 该函数返回const
引用。无论参考引用是什么,都可以检查,但调用者无法修改。SomeType functionName(ArgType arg)
- 该函数返回一个副本。调用者可能对返回值进行的任何修改都不会反映在返回的原始文件上。你的函数的返回类型是第五种类型 - 你是按值返回的,即你的代码会复制指针向量。应该注意的是,尽管调用者无法修改类中的向量,但它们当然可以调用向量元素指向的对象上的方法。如果其中一些方法对项目进行了更改,则原始矢量中的项目也会看到这些更改。换句话说,当您复制指针向量时,您将获得浅副本。
另请注意,如果您想要的只是阻止修改,则无需返回副本:返回指向const
或const
引用的指针将以更高的效率获得相同的结果,因为将避免复制。