C++左移运算符重载

文章讨论了在C++中如何通过成员函数和全局函数重载左移运算符<<。成员函数实现允许p.operator<<(cout),但不能实现cout<<p,而全局函数可以解决这个问题。返回值为ostream&是必要的,以便进行连续的输出操作。未返回ostream&的重载会导致后续的<<操作出错。
摘要由CSDN通过智能技术生成

参考: 函数返回值是否使用引用类型的问题:理解引用、返回值_返回值类型为引用数据的作用_迂者-贺利坚的博客-CSDN博客

左移运算符可以用成员函数实现,但是效果却和实际使用的效果不同,因为利用成员函数重载 左移运算符 p.operator<<(cout), 简化版本 p << cout 与实际需要重载的cout<<p效果不一致

 成员函数实现

#include<iostream>
using namespace std;


class Person
{
public:
	Person() {

	}
	Person(int a,int b):m_A(a),m_B(b) {

	}
	// 利用成员函数重载 左移运算符 p.operator<<(cout), 简化版本 p << cout
	//不会利用成员函数重载<<运算符,因为无法实现 cout在左侧
	ostream& operator<<(ostream& cout) {
		cout << this->m_A << "  ";
		cout << this->m_B << "  ";
		return cout;
	 }

private:
	int m_A;
	int m_B;

};





void test01()
{
	Person p(10, 10);
	
	//无法实现
	//cout<<p;

	//成员函数实现 等价于p.operator<<(cout);
	p << cout;

	


}
int main()
{
    test01();

	return 0;
}

全局函数实现

#include<iostream>
using namespace std;


class Person
{
public:
	Person() {

	}
	Person(int a, int b) :m_A(a), m_B(b) {

	}

public:
	int m_A;
	int m_B;

};

//全局函数
ostream& operator<<(ostream& cout, Person p) { //本质 operator<<(cout,p)  简化cout<<p
	cout << "m_A=" << p.m_A << "m_B= " << p.m_B << " ";
	return cout;
}



void test01()
{
	Person p(10, 10);

	cout << "p的" << p << endl;



}
int main()
{
	test01();

	return 0;
}

返回值为ostream&

    cout << "p的" << p << endl;为例 ,首先执行的是oprate<<(cout,"p的")实际参数——输出流对象cout(本身为引用)传递给形式参数output,在完成输出字符串"p的"的任务后,cout这个引用对象作为返回值返回到被调用处,于是余下的未执行的部分相当于:cout<<p<<endl;。这是自定义的重载函数发生作用了。

另外要注意:

如果定义的函数返回值为引用时,此函数返回的值本身也必须是引用的

比如下面定义的ostream& 返回类型 和 返回的形参cout

#include<iostream>
using namespace std;


class Person
{
public:
	Person() {

	}
	Person(int a, int b) :m_A(a), m_B(b) {

	}

public:
	int m_A;
	int m_B;

};

//全局函数
//无法调用,ostream&为引用,返回的cout不是引用
ostream& operator<<(ostream cout, Person p) { //cout是值返回
	cout << "m_A=" << p.m_A << "m_B= " << p.m_B << " ";
	return cout;
}



void test01()
{
	Person p(10, 10);

	cout << "p的" << p << endl;



}
int main()
{
	test01();

	return 0;
}

这里注意的是如果重载左移运算符函数没有返回值ostream& ,后续再加<<会发生错误

#include<iostream>
using namespace std;


class Person
{
public:
	Person() {

	}
	Person(int a,int b):m_A(a),m_B(b) {

	}
	
public:
	int m_A;
	int m_B;

};

//全局函数
//ostream& operator<<(ostream &cout,Person p) { //本质 operator<<(cout,p)  简化cout<<p
//	cout << "m_A=" << p.m_A << "m_B= " << p.m_B << " ";
//	return cout;
//}

//全局函数 没有返回值
void operator<<(ostream& cout, Person p) {
	cout << "m_A=" << p.m_A << "m_B= " << p.m_B << " ";
   }


void test01()
{
	Person p(10, 10);
	
	//等价于operator<<(cout, p);
	cout << p;
	

//错误,没有返回值接收,无法追加输入<<
	cout << p << p;
	


}
int main()
{
    test01();

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值