// 24友无的方式重载输出运算符
//本节的开头首先讲一下运算符的知道,<<是按位左移运算符,但是当该符号与流对象,比如说cout连用地就变成了输出运算符,或者叫提取运算符
//注意它们的区别,接位左移动算符是用来执行位移操作的,比如说
//int num=1;
//num<<1;
//按位左移运算符(<<)将运算符左边的运算对像num向左移动运算符右侧指定的位数1,然后在低部补0
//了解了它们的区另以后,接下来有个问题,按位左移运算符和输出运算符这两个符号是一样的,编辑器是如何来区分它们的,为了解释这个问题,我们需要返回到上一节的代码中
/*
#include <iostream>
using namespace std;
int main()
{
int num = 1;
int x = num<<1;
cout<<"x:"<<x<<endl;
int y = num>>2;
cout<<"y:"<<y<<endl;
return 0;
}*/
/*
#include <iostream>
using namespace std;
class A
{
public:
A(int x, int y){
rx = x;
ry = y;
};
//定义成友元函数,友元函数可以访问朋友类的私有属性
friend ostream&operator<<(ostream&s, const A&c)
{
s<<c.rx<<endl;
s<<c.ry<<endl;
return s;
};
private:
int rx;
int ry;
};
//现在这个重载输出运算符是整个合局的,任何cout都会调用该重载运算符
//我们重载的这个运算符函数它的第一个参数接受的ostream对像的别名,编辑器就是根据这一点来区别的,当运算符左边的是ostream对像,比如说是cout时,就会调用这个函数来执行输出功能
//而当运算符左边的不是流对象时,方才执行位移操作
//很显然,我们定义的这个函数接受的是ostream对象,执行的也是输出功能,因此我们不能叫他按位移动算函数,而应该称作输出运算符函数,由于它是一个重载的函数,所以叫做重载输出运算符函数
//ostream&operator<<(ostream&s, const A&c)
//{
//s<<c.rx<<" ";
//s<<c.ry<<endl;
//return s;
//};
int main()
{
A a(3,4), b(5,6);
cout<<a<<b<<endl;
return 0;
//这就是返回ostream类对象cout的作用,按位左移动算符<<可以连续使用,由于每次都会返回一个cout,所以中间不用加cout
//注意:由于cout是另一个类ostream的对像,ostream类没有公有和复制构造函数,因此函数无法调用该类的复制构造函数复制对象,必须按引用方式按受ostream的对像并且按引用方式返因ostream对象
}
*/