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

+1

“但我注意到,当我按值传递对象时,它仍然具有相同的效果。” - 有什么影响? – 2013-10-25 19:25:02

+0

什么效果,什么操作符?添加一个例子。 –

+0

“最好通过参考,通常是出于性能原因。”这些日子,情况正好相反。 –

回答

0

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

在第一运营商+:

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的开销(因为它必须在第一个方法中)。如果您需要复制方法主体中的传入参数,则此答案将会有所改变。但是在这里你没有。