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*本身不会被编辑,所以这不是这里的问题。

4

1 回答 1

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引用的指针会以更高的效率获得相同的结果,因为会避免复制。

于 2013-10-19T14:43:13.123 回答