如何在C ++中返回实际引用

时间:2016-09-05 18:05:19

标签: c++ c++11

我正在实施双连通分量算法。在图表表示中有几个只读方法可以返回一个副本。如何更改这些以返回实际参考而不是副本?我很迷惑。学习这些东西有很好的资源吗?以下是一些例子:

  1. 获得邻居顶点。

    list<Vertex> Vertex::getNeighbors() const {
    return this->_neighbors;
    }
    
  2. 获得边缘

    vector<Edge> Graph::getEdges() const {
    unordered_set<string> distinctEdges;
    vector<Edge> edges;
    
    for (auto vertex = _verticies.begin(); vertex != _verticies.end(); vertex++) {
        auto neighbors = vertex->getNeighbors();
            for (auto neighbor = neighbors.begin(); neighbor != neighbors.end(); neighbor++) {
            Edge e(*vertex, *neighbor);
    
             if (distinctEdges.count(e.str()) > 0) {
             continue;
             }
    
        distinctEdges.insert(e.str());
        edges.push_back(e);
        }
    }
    
    return edges;
    }
    
  3. 更新: 我需要引用,以便稍后可以使用以下内容更新它:

    void Graph::updateVertex(size_t id, size_t level) {
        auto u = this->_findVertex(Vertex(id));
        if (u == this->_verticies.end()) {
           return;
        }
        u->level = level;
    }
    

    如果是副本,则不会更新原件。感谢。

2 个答案:

答案 0 :(得分:1)

要从函数返回对类的私有成员的只读引用,您需要将函数的返回类型更改为const T&,其中T是您想要的类型。

现在关于从函数返回对局部变量的引用。局部变量仅在它们在范围内时存在,然后它们超出范围,它们被销毁。这意味着返回的局部变量引用无效,返回变量的唯一方法是按值。

答案 1 :(得分:0)

你需要先问问自己,为什么需要参考。

  1. 例如,您应该返回const list<Vertex>&

  2. 这里你不能返回引用,因为你要返回的是一个局部变量。

  3. 在这两种情况下,您都无法获得返回引用。如果你考虑性能或大小 - 忘掉它,编译器会优化它,你不会看到差异。