为什么operator<<;;运算符重载一定要为友元函数呢?
Posted jieniyimiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么operator<<;;运算符重载一定要为友元函数呢?相关的知识,希望对你有一定的参考价值。
如果是重载双目操作符(即为类的成员函数),就只要设置一个参数作为右侧运算量,而左侧运算量就是对象本身。。。。。。
而 >> 或<< 左侧运算量是 cin或cout 而不是对象本身,所以不满足后面一点。。。。。。。。就只能申明为友元函数了。。。
如果一定要声明为成员函数,只能成为如下的形式:
ostream & operator<<(ostream &output)
return output;
所以在运用这个<<运算符时就变为这种形式了:data<<cout;
不合符人的习惯。
运算符重载函数可以作为成员函数,友元函数,普通函数。
普通函数:一般不用,通过类的公共接口间接访问私有成员。
成员函数:可通过this指针访问本类的成员,可以少写一个参数,但是表达式左边的第一个参数必须是类对象,通过该类对象来调用成员函数。
友元函数:左边一般不是对象。<< >>运算符一般都要申明为友元重载函数。
一般情况下:
将双目运算符重载为友元函数,这样就可以使用交换律,比较方便
单目运算符一般重载为成员函数,因为直接对类对象本身进行操作
总之:如果运算符重载为成员函数,第一个参数必须是本类的对象,因为默认使用第一个参数的对象进行调用该成员函数。
以上是关于为什么operator<<;;运算符重载一定要为友元函数呢?的主要内容,如果未能解决你的问题,请参考以下文章
strcmp() 和 Spaceship Operator (<=>) 有啥区别