在重载函数中按引用传递对象与按值传递对象
Passing object by reference vs by value in overload functions
我一直在读到,在执行重载运算符函数时,最好通过引用传递,通常是出于性能原因。但我注意到,当我按值传递对象时,它仍然具有相同的效果。按值传递它不应该影响运算符吗?我知道,如果你有两个 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 的开销(就像在第一种方法中一样)。如果您需要在方法主体中复制传递的参数,此答案会略有变化。但在这里你没有。
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- C++类 - 初始化列表 - 递归 - 按值传递
- 将函数参数完美转发到函数指针:按值传递呢?
- 棘手的按值传递和按引用递归问题传递
- 防止在按值传递对象(继承)时进行切片
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 可移动但不可复制的对象:按值传递还是按引用传递?
- 当我按值传递参数时对象被破坏时?
- 自定义类型转换运算符在转发引用上调用时不起作用(当对象按值传递时有效)
- GCC 对象按值或地址传递
- 是否可以按值传递临时对象而不破坏C++中的原始对象
- 按值传递对象时与按引用传递对象时运行时较慢
- 在重载函数中按引用传递对象与按值传递对象
- C++ 程序在按值传递对象时崩溃
- C++:按值传递对象的原因
- 当用于初始化另一个对象时,为什么要按值传递参数
- 按值传递对象时调用的析构函数
- 为什么即使对象没有复制构造函数,也可以按值传递对象
- 按值传递可调用对象,将其分配给指针成员
- 按值传递对象时出现断言错误--它是我的复制构造函数