C++:类和对象-运算符重载-左移运算符重载

文章讲述了在C++中如何通过重载运算符<<来实现类对象的输出,强调了不能在类内部重载此运算符的原因,并给出了全局函数重载的方法。同时,讨论了返回值类型对于链式调用的重要性,以及在成员属性为私有时如何使用友元函数解决访问问题。
摘要由CSDN通过智能技术生成

想法:
 

#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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值