在 C++ 中按引用返回与按值返回

时间:2021-07-06 12:02:20

标签: c++ function reference

给定以下向量和函数:

std::vector<int> param;
std::vector<int>& getparam_1() {
return param;
}

std::vector<int> getparam_2() {
return param;
}

我知道以下两个表达式都会被编译:

std::vector<int> param_copy1 = getparam_1();
std::vector<int> param_copy2 = getparam_2();

但它们的区别是什么?

3 个答案:

答案 0 :(得分:3)

最明显的区别是如果按引用返回,则可以更改全局变量。

示例

#include <iostream>
#include <vector>

std::vector<int> param{ 1,2,3,4,5 };
std::vector<int>& getparam_1()
{
    return param;
}

std::vector<int> getparam_2()
{
    return param;
}

int main()
{
    getparam_1().push_back(9);
    for (const auto& i : param)
    {
        std::cout << i;
    }
}

这将打印“123459”。

#include <iostream>
#include <vector>

std::vector<int> param{ 1,2,3,4,5 };
std::vector<int>& getparam_1()
{
    return param;
}

std::vector<int> getparam_2()
{
    return param;
}

int main()
{
    getparam_2().push_back(9);
    for (const auto& i : param)
    {
        std::cout << i;
    }
}

这将打印“12345”。

答案 1 :(得分:2)

<块引用>

但它们的区别是什么?

结果是一样的,所以在这方面没有区别。

从抽象机器的角度来看,在 C++17 之前,两个示例都有一个副本,第二个示例从该副本开始移动。但是移动可以被优化掉,所以仍然没有必然的实际差异。从 C++17 开始,只有一个副本,两种情况下都没有移动。

抽象机器在复制发生的地方略有不同。在第一个示例中,副本位于函数外部,而在第二个示例中,副本位于函数内部。

答案 2 :(得分:1)

按价值返回

该值的副本返回给调用者。

引用返回

对变量的引用被传递回调用者。然后调用者可以使用这个引用来继续修改向量。

如果您在向量中使用 int,则不必费心按引用返回 它并没有太大的不同。如果您正在使用类或结构,则应考虑使用按引用或指针返回。

相关问题