繁体   English   中英

从C ++方法返回引用还是副本

[英]Returning a reference vs. a copy from a C++ method

我目前正在学习C ++,并且对从方法返回引用的概念有些困惑。 考虑以下玩具示例:

#include <iostream>
#include <vector>

class IntHolder {

private:

    std::vector<int> d_values;

public:

    IntHolder() {
        d_values.push_back(1);
        d_values.push_back(2);
        d_values.push_back(3);
    }

    std::vector<int> &values() {
        return d_values;
    }

};

int main(int argc, char **argv) {
    IntHolder h;
    std::vector<int> ret_val = h.values();
    std::cout << ret_val.size() << std::endl;

    ret_val.push_back(4);
    ret_val.push_back(5);

    std::cout << h.values().size() << std::endl;

    return 0;
}

这会将以下内容打印到标准输出:

3
3

由于我们返回的是对d_values的引用,因此返回的对象不应该与IntHolder实例中存储的对象相同,因此在再次调用h.values()时,应该看到5的大小吗?

既然不是这种情况,那么返回对对象的引用或对象的副本有什么区别? 从方法返回时有什么区别吗?

您正在从values函数返回一个引用,但没有返回的对象分配给引用变量。 相反,您正在为其制作副本 ,因为您将其分配给名为ret_val的新std::vector<int>

您想要像这样修改代码,以便捕获返回的引用:

std::vector<int>& ret_val = h.values();

或简单地:

auto& ret_val = h.values();

您的方法返回一个引用,但是您随后将结果分配给另一个向量,从而导致复制。 要解决此问题,请将您的ret_val定义更改为:

std::vector<int> & ret_val = h.values();

如果返回引用,则返回相同的对象,而不是在创建副本。 基本上,这似乎与您期望的一样:

std::cout << h.values().size() << std::endl;
h.values().push_back(4);
h.values().push_back(5);
std::cout << h.values().size() << std::endl;

会回来

3
5

错误的阶段是另一个。 让我们来看看

std::vector<int> ret_val = h.values();

你发现ret_val是副本h.d_valuesh.values()的返回对它的引用。 我们可以按如下方式重写您的代码:

std::vector<int> &ret_ref = h.values(); // object returned by `h.values()`
std::vector<int>  ret_val = ret_ref;

如果您正在调用ret_ref.push_back(4) ,则h.d_values将会更改。 但是ret_val是返回对象的副本,不会影响h.d_values

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM