C++ 重载运算符、常量参数还是按值传递?

标签 c++ operator-overloading parameter-passing

template <typename T>
T operator+(T a, const T& b) {
    a += b;
    return a;
}

template <typename T>
T operator+(const T& a, const T& b) {
    T tmp {a};
    tmp += b;
    return tmp;
}

有什么理由让你像第二个函数一样将参数作为常量引用传递,而不是像第一个函数那样直接按值传递,因为无论如何你都需要一个临时变量?


编辑1:

我想我应该提到,这两个函数替代仅用于处理带有左值参数的情况,并且我将提供另外两个函数来处理右值参数,如下所示。

template <typename T>
T operator+(T&& a, const T& b) {
    a += b;
    return std::move(a);
}

template <typename T>
T operator+(const T& a, T&& b) {
    b += a;
    return std::move(b);
}

所以问题的重点是,为什么我需要显式创建一个临时变量(函数 2),而我可以让语言自动为我提供便利(函数 1)?

最佳答案

template <typename T>
T operator+(T a, const T& b) {
    a += b;
    return a;
}

在这里,您将创建变量a的拷贝,该拷贝将传入此处,然后您将更新拷贝。这需要创建三个拷贝,并且您再次按值返回。

template <typename T>
T operator+(const T& a, const T& b) {
    T tmp {a};
    tmp += b;
    return tmp;
}

在这里,您的tmp变量具有本地作用域,并且变量a是const引用,因此不允许修改a的值。 并且您将返回 temp 的拷贝,它是一个局部变量。

两者都工作正常,但区别在于创建的拷贝数量。您在第一种情况下复制的拷贝数量多于第二种情况。

尽管第二个将针对 tmp 变量进行优化,以使用移动语义来减少拷贝。所以在第二种情况下你会有更快的性能

关于C++ 重载运算符、常量参数还是按值传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65508006/

相关文章:

c++ - 如何在 C++ 中将类类型映射到该类的实例?

c# - 双向隐式运算符重载的模式名称和接口(interface)

php - 你能传递比函数预期更多的参数吗?

windows - 使用 VB6 + Windows 7 传递 ByRef 的参数

c++ - C++ 中的 vector <int>::size_type

c++ - 从文本文件中按列读入一组整数到变量数组

c++ - 重载 std::bitset 的移位运算符

c++ - 如何用 2 个 LinkedLls 重载 +=

java - SQL JdbcTemplate 的多个参数

c++ - 基于范围的循环不适用于数组指针