2

我一直在阅读,在执行重载运算符函数时,最好通过引用传递,通常是出于性能原因。但是我注意到,当我按值传递对象时,它仍然具有相同的效果。不应该按值传递它不影响操作员吗?我知道如果你有两个 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 类中,运算符和变量都定义在同一个类中,所以同样的不适用,这就是为什么它实际上会重载运算符?

4

1 回答 1

0

您定义的两个 operator+ 重载都返回一个年龄值为 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 示例中,operator+ 只需要返回一个新的 Person 对象,该对象具有通过添加两个 Person 对象获得的正确值。

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

于 2013-10-26T08:43:35.833 回答