c++ - 在运算符重载中按值传递错误
问题描述
我试图理解为什么在简单的类定义中按引用传递和按值传递不起作用
#include <iostream>
class Rettangolo {
int a, b;
public:
Rettangolo (Rettangolo& r) {
a = r.a;
}
Rettangolo (int _a, int _b) : a(_a), b(_b) {};
Rettangolo operator+= (Rettangolo r1);
void print() {
std::cout << a << ", " << b;
}
};
Rettangolo Rettangolo::operator+= (Rettangolo r1) {
a += r1.a;
b += r1.b;
return *this;
};
int main() {
std::cout << "Hello World!\n";
Rettangolo recta (1, 2);
Rettangolo rectb (5, 6);
recta += rectb;
recta.print ();
}
如果我在 operator+= 的参数中使用 (Rettangolo r1) ,如上例所示,则输出为“6,2”。但是如果我在参数中使用 (Rettangolo& r1) 输出是“6, 8”,正如我所料
解决方案
这是因为您的复制构造函数没有完全发挥作用。它只复制a
,而不是b
。因此,rectb
当您调用时复制时,按值operator+=
传递,复制并添加到但不复制,因此不添加到。要解决此问题,请在复制构造函数中添加复制,或者只是将其删除,编译器将为您生成一个默认的复制构造函数,它同时复制和。rectb
a
recta
b
recta
b
a
b
推荐阅读
- firebase - 我的 Firebase 用户身份验证中的未知用户(Flutter/firebase)
- java - 将 EditText 前后的加号和减号按钮分别翻译 Kotlin 中的代码到 Java
- amazon-web-services - AWS lambda 持续时间峰值(与冷启动无关)
- c# - 当我们的类具有类似的高级功能但在方法中返回不同类型时,使用哪种设计模式?
- c - 为什么我的代码没有将结果写入文件?
- elasticsearch - 使用 quarkus logging-gelf 扩展和 ELK 堆栈时出现索引错误
- c# - 使用 Fody Costura 创建包含 CefSharp 的类库
- angular - 在 Angular 中使用 ngbModule 时出错
- ios - 转换到横向后如何更新 UITableViewCell 内的 UICollectionView
- java - Weblogic 12.2.1.4 - java.sql.SQLException / CLOB 兼容性问题