运算符重载(左移运算符)

左移运算符重载

  • 通常不会利用成员函数重载左移运算符。因为如果按照 类名 operator <<(ostream &cout) ,那么实例化一个对象p,调用时简化版本为 p << cout ;,这和想要实现的就相反了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
using namespace std;
class Person {
public:
Person(int a, int b) :m_a(a), m_b(b) { }
Person& operator << (ostream& out) {
cout << "m_a = " << this->m_a << " m_b = " << this->m_b << endl;
return *this;
}
private:
int m_a;
int m_b;
};
void test01() {
Person p(10,10);
p << cout <<cout;
}
int main() {
test01();
return 0;
}
  • 可以利用全局函数重载左移运算符。

    注意:

    (1)cout 做形参时只能是引用。c++中std::ostream这个类只有一个实例 cout ,按值传递相当于在重载函数 中又定义了一个 ostream 实例,只是不允许的,但是使用引用传递的话便还是原来的 cout,只是作为一个别名存在。

    (2)为了实现链式输出,返回值需要为 cout ,所以函数返回值类型为 ostream &

    (3)注意形参可以写成其他的名字,比如 ostream &out,因为 out 相当于是 cout 的别名。

    (4)可以配合友元实现输出自定义数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
using namespace std;
class Person {
//声明此函数为友元函数,可以防私有属性
friend ostream& operator << (ostream& out, Person& p);
public:
Person(int a, int b) :m_a(a), m_b(b) { }
private:
int m_a;
int m_b;
};
ostream& operator << (ostream &out ,Person &p) {
cout << "m_a = " << p.m_a << " m_b = " << p.m_b << endl;
return out;//实现链式输出
}
void test01() {
Person p(10,10);
cout << p << endl;
}
int main() {
test01();
return 0;
}