一、综述:
描述输入输出运算符重载方法,输入输出逻辑相同,所以以输出为主,描述重点在输出运算符重载函数的形参(简单说下cout与ostream)、返回值类型以及形参位置,(参考c++参考手册)。
二、重载运算符的两种方法:
1.成员函数方式
1.1示例
#include <iostream>
using namespace std;
class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
const Complex operator+(const Complex& c){
Complex tmp(real+c.real, imag+c.imag);
return tem;
}
};
1.2参数在左边还是右边
左操作数是调用该函数的对象,而右操作数作为参数传递给函数。
这里operator+
是Complex
类的成员函数,左操作数是调用这个函数的Complex
对象(*this
),右操作数是传递给函数的c。
2.友元函数方式
2.1示例
#include <iostream>
using namespace std;
class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
friend const Complex operator+(const Complex& c, const Complex& d);
};
const Complex operator+(const Complex& c, const Complex& d){
Complex tmp(c.real + d.real, c.imag + d.imag);
return tem;
}
2.2参数在左边还是右边
左右操作数都作为参数传递给函数。
这里operator+
是友元函数,它接受两个参数,分别表示左操作数和右操作数。
3."<<"采用形式
如果<<
运算符作为类的成员函数定义,那么调用<<
时,左操作数必须是该类的实例。这就意味着我们需要这样定义和使用: 类名 << cout ,这样不符合我们常见的形式。
作为成员函数修改为常见的cout << 类名 形式可以,那就要在cout这个类里去添加成员函数了,而cout是标准库的全局变量,没办法改啊,还是用友元吧。
三、cout与ostream
1.cout与ostream之间的关系
来自C++参考手册
1.1ostream
ostream是basic_ostream的别称,从这可以看出ostream是一个类名。
1.2cout
说明cout是ostream类型的一个变量
2.cout中的运算符<<重载
cout是可以识别数据类型的,所以有针对不同类型有很多重载,就挑一个看看理解大概意思就好了。
返回值是ostream类型的引用,形参是一个整型。所以在看一下 cout << (int)1;,是不是明白了。
四、重载输出运算符 <<
重载输出运算符通常用于将自定义类型的对象输出到输出流(如std::cout
)。
假设我们有一个表示复数的类Complex
,我们希望能够使用<<
来输出复数的值。
#include <iostream>
using namespace std;
class Complex {
private:
double real;
double imag;
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}
friend ostream& operator<<(ostream& out, const Complex& c);
};
ostream& operator<<(ostream& out, const Complex& c) {
out << "(" << c.real << ", " << c.imag << ")";
return out;
}
int main() {
Complex c1(3.0, 4.5);
cout << "The complex number is: " << c1 << endl;
return 0;
}
在这个示例中:
operator<<
被定义为一个友元函数。- 函数参数包括输出流对象(通常是
ostream&
)和常量引用的复数对象。 - 函数返回输出流对象的引用以便支持链式调用(如
cout << c1 << c2
)。
五、重载输入运算符 >>
类似地,重载输入运算符允许将数据从输入流(如std::cin
)读取到自定义类型的对象中。通常也会被定义为友元函数以便更灵活地处理不同的输入流。
示例:
继续使用复数类的例子,我们希望能够使用>>
来输入复数的值
-
#include <iostream> using namespace std; class Complex { private: double real; double imag; public: Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {} friend istream& operator>>(istream& in, Complex& c); }; istream& operator>>(istream& in, Complex& c) { in >> c.real >> c.imag; return in; } int main() { Complex c2; cout << "Enter a complex number (real and imaginary parts): "; cin >> c2; cout << "You entered: " << c2 << endl; return 0; }
在这个示例中:
operator>>
被定义为一个友元函数。- 函数参数包括输入流对象(通常是
std::istream&
)和非常量引用的复数对象。 - 函数返回输入流对象的引用以便支持链式调用(如
std::cin >> c1 >> c2
)。
六、总结
重点还是要了解一下cout。像嵌套的关系,‘cout << c1; ’这时候运算符重载是我们设置的那个函数,然后进到函数里变成了‘cout << "(" << c1.real << ", " << c1.imag << ")";’这时候的重载运算符的函数就是ostream里的那个成员函数了,然后输出到stdout。