CPP学习之——重载输出运算符(18.19)

一 概述

本节学习重载按位左移运算符"<<",我们知道cout配合按位左移运算符"<<"可以输出数据或者字符。

二 实例演示及结果输出

2.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
class A {
public:
A(int x, int y){rx = x;ry = y;}
int rx;
int ry;
};
ostream&operator<<(ostream&s,A&a)
{
s<<a.rx;
s<<a.ry;
return s;
}
int main() {
A a(1,2),b(3,4);
cout<<a<<endl;
cout<<b<<endl;
return 0;
}

2.2 输出结果

1
2
12
34

2.3 说明

  • operator是进行运算符重载的关键词,它后面就是重载的运算符<<,小括号内有两个参数,s代表stream中的对象cout的别名,c代表类A的对象的别名。由于cout属于ostream输出流中的一个对象,因此返回类型为ostream
  • 这就是返回ostream类对象cout的作用,按位左移运算符<<可以连续使用,由于每次都会返回一个cout,所以中间不用加cout
  • 注意:由于cout是另一个类ostream的对象,ostream类没有公有的赋值构造函数,因此函数无法调用该类的复制构造函数复制对象,必须按引用方式接受ostream的对象并且按引用方式返回ostream对象

三 以友元的方式重载输出运算符

3.1 输出与左移运算符的区别

  • 本节的开头首先讲一下运算符的知识,<<是按位左移运算符,但是当该符号与流对象,比如说cout连用时就变成了输出运算符,或者叫提取原算符。
  • 注意它们的区别,按位左移运算符是用来执行位移操作的,比如说int num=1;num<<1;按位左移运算符"<<"将运算符左边的运算对象num向左移动运算符右侧指定的位数1,然后在低位补0

3.2 程序说明

  • 很显然,我们定义的这个函数接受的是ostream对象,执行的也是输出功能,因此我们不能叫它按位左移运算符函数,而应该称作输出运算符函数。由于它是一个重载的函数,所以叫做重载输出运算符函数。
  • 这个函数时个全局函数,这样当程序遇到cout和输出运算符时,就会自动调用我们自定义的重载输出运算符函数,该函数实现了一个功能,即直接输出类A对象中的数据。
  • 由于这个函数时针对类A的,而且我们也不希望将类A的数据成员定义为公有的,所以我们不妨将该函数定义为类A的成员函数
  • 在函数前面加上关键字friend后,该函数变成了类A的友元函数,这样该函数就可以以朋友的身份类访问该类的私有成员,类A的私有成员对朋友是公开的

3.3 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
using namespace std;
class A {
public:
A(int x, int y){rx = x;ry = y;}
friend ostream&operator<<(ostream&s,A&a)
{
s<<a.rx;
s<<a.ry;
return s;
}
int rx;
int ry;

};
int main()
{
A a(1,2),b(3,4);
cout<<a<<endl;
cout<<b<<endl;
return 0;
}