通过引用传递对象与通过重载函数中的值传递

时间:2013-10-25 19:22:49

标签: c++

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

示例:

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

    return sum;
} 

如果我有一个main并且执行:

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类中,运算符和变量都是在同一个类中定义的,那么同样的情况并不适用,这就是为什么它实际上会使运算符超载的原因?

1 个答案:

答案 0 :(得分:0)

您定义的运算符+重载都返回一个年龄值为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的开销(因为它必须在第一个方法中)。如果您需要复制方法体中传入的参数,这个答案会有所改变。但在这里你没有。

相关问题