第十八章 24友元的方式重载输出运算符 简单

// 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对象
}
*/

  

原文地址:https://www.cnblogs.com/xiangxiaodong/p/2700744.html