C++运算符重载流需要强制转换
C++ operator overloading stream requires cast
我正在重载一个类上的一些操作,注意到在ostream上重载其中一个值并不像预期的那样。以下是示例:
#include <iostream>
using namespace std;
class Simple{
int x;
public:
Simple() : x(0){}
Simple(int i) : x(i){}
const Simple& operator+(const Simple& s){
return Simple(x + s.x);
}
friend ostream& operator<<(ostream& os, const Simple& s);
};
ostream& operator<<(ostream& os, const Simple& s){
os << s.x;
return os;
}
int main(void){
Simple s1(2);
Simple s2(3);
cout << "s1 = " << s1 << endl;
cout << "s2 = " << s2 << endl;
cout << "s1 + s2 = ";
Simple s3 = s1 + s2;
cout << s1 << " + " << s2 << " = " << s1 + s2 << endl;
cout << s1 << " + " << s2 << " = " << static_cast<Simple>(s1 + s2) << endl;
cout << "s3 = " << s3 << endl;
return 0;
}
它产生以下输出:
s1=2
s2=3
s1+s2=2+3=-872483744
2+3=5
s3=5
这是我如何重载的问题吗?还是总是需要强制转换来获得我期望的输出?
您的operator+
返回一个对局部变量的引用,以及一个临时变量。
这是一个悬空引用。
operator+
应按值返回。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 构造函数和转换运算符之间的重载解析
- 分配给转换运算符失败-C++
- 转换运算符不适用于sleep_until
- 继承模板化转换运算符
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 如何在模板化转换运算符中消除此构造的歧义?
- 为什么选择转换运算符的重载?
- 如何避免强制转换运算符 () 和访问运算符 [] 冲突?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 了解转换运算符的选择C++
- 多个隐式转换运算符
- 这个typedef和转换运算符语法是什么意思
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 类模板忽略了用户定义的转换运算符(非模板不忽略)
- 为什么在std::for_each()返回时调用转换运算符
- 为什么 std::optional 的强制转换运算符被忽略了
- 使用用户定义的转换运算符推导函数模板参数
- 模板转换运算符的分辨率不明确
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?