C++ 运算符 I/O 重载
C++ operator I/O overloading
我在为 Complex
class 重载 <<
运算符时遇到了一个奇怪的问题(复杂的 class 和重载功能并不完整,但意思应该是一样的 - 但是如果你觉得缺少一些重要的部分,请提示我 ;-) ):
class Complex {
float m_fReal;
float m_fImaginary;
public:
Complex();
Complex(float real, float imaginary);
Complex add(Complex) const;
friend std::ostream& operator<<
(std::ostream& out, Complex cComplex);
};
重载函数:
std::ostream& operator<<(std::ostream& out, Complex cComplex) {
out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
return out;
}
添加功能:
Complex Complex::add(Complex cComplex) const {
return Complex (m_fReal + cComplex.m_fReal,
m_fImaginary + cComplex.m_fImaginary);
}
主函数调用:
Complex x(1,1), y(2,2);
cout << "x+y=" << x.add(y) << endl;
虽然上面的方法可行,但这个不行(只有不同的部分)。
Complex
中的声明class:
friend std::ostream& operator<<
(std::ostream& out, Complex& cComplex);
定义:
std::ostream& operator<<(std::ostream& out, Complex& cComplex) {
out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
return out;
}
我的意图是通过引用传递 Complex class。谁能给我解释一下,这段代码出了什么问题,为什么?
您需要通过const
引用接受要输出的对象。您将其作为非常量引用接受,add
中的 return 无法绑定到该引用。
std::ostream& operator<<(std::ostream& out, const Complex& cComplex) {
这 design/behavior 是为了防止函数期望改变引用参数的值,但引用已绑定到未命名的临时对象,换句话说,内存无法访问的错误再次,使更改毫无意义。
你的定义应该是
std::ostream& operator<<(std::ostream& out, const Complex& cComplex) {
out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
return out;
}
cComplex 需要是 const 限定的,您才能使用“.”访问它的私有变量。
我在为 Complex
class 重载 <<
运算符时遇到了一个奇怪的问题(复杂的 class 和重载功能并不完整,但意思应该是一样的 - 但是如果你觉得缺少一些重要的部分,请提示我 ;-) ):
class Complex {
float m_fReal;
float m_fImaginary;
public:
Complex();
Complex(float real, float imaginary);
Complex add(Complex) const;
friend std::ostream& operator<<
(std::ostream& out, Complex cComplex);
};
重载函数:
std::ostream& operator<<(std::ostream& out, Complex cComplex) {
out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
return out;
}
添加功能:
Complex Complex::add(Complex cComplex) const {
return Complex (m_fReal + cComplex.m_fReal,
m_fImaginary + cComplex.m_fImaginary);
}
主函数调用:
Complex x(1,1), y(2,2);
cout << "x+y=" << x.add(y) << endl;
虽然上面的方法可行,但这个不行(只有不同的部分)。
Complex
中的声明class:
friend std::ostream& operator<<
(std::ostream& out, Complex& cComplex);
定义:
std::ostream& operator<<(std::ostream& out, Complex& cComplex) {
out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
return out;
}
我的意图是通过引用传递 Complex class。谁能给我解释一下,这段代码出了什么问题,为什么?
您需要通过const
引用接受要输出的对象。您将其作为非常量引用接受,add
中的 return 无法绑定到该引用。
std::ostream& operator<<(std::ostream& out, const Complex& cComplex) {
这 design/behavior 是为了防止函数期望改变引用参数的值,但引用已绑定到未命名的临时对象,换句话说,内存无法访问的错误再次,使更改毫无意义。
你的定义应该是
std::ostream& operator<<(std::ostream& out, const Complex& cComplex) {
out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
return out;
}
cComplex 需要是 const 限定的,您才能使用“.”访问它的私有变量。