在重载函数中按引用传递对象与按值传递对象

Passing object by reference vs by value in overload functions

本文关键字:对象 按值传递 按引用传递 重载 函数      更新时间:2023-10-16

我一直在读到,在执行重载运算符函数时,最好通过引用传递,通常是出于性能原因。但我注意到,当我按值传递对象时,它仍然具有相同的效果。按值传递它不应该影响运算符吗?我知道,如果你有两个 int 变量,并且你想通过将它们传递给另一个函数来交换它们,那么它只有在你通过引用传递(或传递指针)时才有效。如果刚刚传递了该值,则变量在末尾保持不变。那么这不应该同样适用于传递类对象吗?

例:

Person Person::operator+(Person obj1){
    Person sum;
    sum.age = this->age + obj1.age;
    return sum;
} 

如果我有一个主菜并做:

Person person1(14);
Person person2(182);
Person3 = person1 + person2;
std::cout << person3.age << std::endl;

它的作用与我所做的相同

Person Person::operator+(Person &obj1){
    Person sum;
    sum.age = this->age + obj1.age;
    return sum;
} 

所以我有点像我提到的交换方法一样思考这个问题。如果我将值传递给交换函数,它不会更改变量的原始值。我在想,如果我只是传递对象而不是引用,它实际上不会改变运算符的重载。现在我在想,既然在我的 Person 类中,运算符和变量都是在同一个类中定义的,那么同样不适用,这就是为什么它实际上会重载运算符?

您定义的运算符 + 重载都返回一个年龄值为 196 的 Person 对象(除了您的输出之外,我应该返回该对象)。这两种方法都不会尝试修改传入的值(一个通过隐式 this 指针)。我试图通过直接在下面的每种方法中的评论来说明原因。

在第一个运算符+中:

Person Person::operator+(Person obj1){
    // We have access to Person1 via the implicit this pointer.
    // obj1 is a copy of Person2. Hence, we have no access to Person2.
    Person sum;
    // The next statement only reads from the 2 objects.
    sum.age = this->age + obj1.age;
    // New object returned without any side effects to Person1 or Person2.
    return sum;
}

在第二个运算符+中:

Person Person::operator+(Person &obj1){
    // We have access to Person1 via the implicit this pointer.
    // We have access to Person2 by obj1.
    Person sum;
    // The next statement only reads from the 2 objects.
    sum.age = this->age + obj1.age;
    // New object returned without any side effects to Person1 or Person2.
    return sum;
}

您可以通过修改两个方法签名来证明这一点:

Person Person::operator+(Person obj1) const
Person Person::operator+(const Person &obj1) const

现在,不允许这两种方法修改要添加的值。

您给出的关于需要通过引用或指针传递以使交换工作状态的交换示例是这样的,因为交换必须修改正在交换的对象。在 Person 示例中,运算符 + 只需要返回一个新的 Person 对象,该对象具有通过添加两个 Person 对象获得的正确值。

在您的示例中,您应该更喜欢通过 const 引用传递,因为它将跳过复制 Person2 的开销(就像在第一种方法中一样)。如果您需要在方法主体中复制传递的参数,此答案会略有变化。但在这里你没有。