第十八章 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对象 } */