想法:
#include<iostream>
using namespace std;
class Person {
public:
int ma;
int mb;
};
int main() {
Person p;
p.ma = 10;
p.mb = 10;
cout << p << endl;
}
想要用cout<<p<<endl;就可以实现ma和mb的输出,此时对<<进行处理
注意1:
(1).不会利用成员函数重载<<运算符,因为无法实现cout在左侧
(2).原因:
①.如果成员函数这么写
void operator<<(Person&p){
//......
}
那么调用的时候出现的是p.operator<<(p1);
但我们只有一个对象p,p1不能存在
②.如果成员函数这么写
void operator<<(cout){
//......}
但是我们想要的结果是cout<<p;
这样输出的结果p<<cout;所以错误
注意2.
(1).只能用全局函数重载左移运算符
(2).cout是标准的输出流对象(ostream类)
例子如下:
#include<iostream>
using namespace std;
class Person {
public:
int ma;
int mb;
};
void operator<<(ostream &cout,Person &p) //本质 operator<<(cout,p)化简为cout<<p
{
cout << "ma=" << p.ma << "mb=" << p.mb << endl;
}
int main() {
Person p;
p.ma = 10;
p.mb = 10;
cout << p;
}
思考3:如果将cout<<p;转变成cout<<p<<endl;会怎么样
(1).答:会报错
(2).原因:
cout<<p<<endl;//p后面还能继续输出是由于链式编程的思想
void operator<<(ostream&cout,Person &p);
而这个函数调用之后返回的是一个void,就不能使用返回的这个void继续调用追加新的内容了
如果这个函数调用之后还能再返回一个cout,那就能继续往后追加新的内容了
修改之后为:
ostream & operatop<<(ostream&cout,Person &p){
cout<<"ma="<<p.ma<<"mb="<<p.mb;
return cout;
}
就可以使用cout<<p<<endl;
代码如下:
#include<iostream>
using namespace std;
class Person {
public:
int ma;
int mb;
};
ostream& operator<<(ostream &cout,Person &p) //本质 operator<<(cout,p)化简为cout<<p
{
cout << "ma=" << p.ma << "mb=" << p.mb << endl;
return cout;
}
int main() {
Person p;
p.ma = 10;
p.mb = 10;
cout << p<<endl;
}
思考4:
(1).如果将
ostream& operator<<(ostream &cout,Person &p) //本质 operator<<(cout,p)化简为cout<<p
{
cout << "ma=" << p.ma << "mb=" << p.mb << endl;
return cout;
}
最后一行的return cout;改为return out;代码会报错吗?
(2).答:可以。
原因:引用的本身就是起别名,out就是cout的一个别名。其对结果没有任何影响
思考5:如果我将成员属性从public改为private会怎么样
(1).答:会立马报错
(2).解决方法:应用友元
代码如下:
#include<iostream>
using namespace std;
class Person {
friend ostream& operator<<(ostream& cout, Person& p);
private:
int ma;
int mb;
public:
Person(int a,int b) {
ma = a;
mb = b;
}
};
ostream& operator<<(ostream &cout,Person &p) //本质 operator<<(cout,p)化简为cout<<p
{
cout << "ma=" << p.ma << "mb=" << p.mb << endl;
return cout;
}
int main() {
Person p(10,10);
cout << p<<endl;
}