C++:重载输出运算符<<为什么必须写成非成员函数?

1. 运算符作为成员函数时,其左侧运算对象必须是运算符所属类的一个对象

首先明白一个基本概念,对于成员函数,其左侧运算对象必须是运算符所属类的一个对象。也就是说左侧的这个对象必须和运算符必须同属一个类,否则当其他类的对象调用该符号 << 时,在其他类内找不到该符号的成员函数。

该概念在C++Primer第五版14.1内解释过:

选择成员或者非成员.png

2. 然后基于上述概念可以解释为什么 << 不可以是 成员函数。

class bookshop
{ 
    public:
    bookshop
} //创建一个为bookshop的类


bookshop bitleef; // 创建一个为bitleef的对象,即一个叫bitleef的书店

//1、假设operator << 为bookshop类内的一个成员函数,那么输出书店内的内容时有
bitleef << cout; //因为这里 << 为bookshop内的成员函数,所以得把bitleef写到左侧。
                //而平时使用的 << 为标准库里的,<< 和 cout属于同一个类,所以可以cout <<

因为 bitleef << cout; 这种输出有违一般使用方法,所以综上 << 不定义为成员函数。

3. 再说为什么可以定义为 非成员函数:

当定义为非成员函数后,左值的数据类型为参数列表第一个的数据类型,左值的数据类型可以随意定义。实际调用时根据左右值的数据类型调用对应的函数。下面举例三种情况:

// 定义三种 全局的 运算符函数
inline bool // 函数1
operator != (const complex& x, const complex& y)
{
    return real (x) != real (y) || imag (x) != imag (y);
}

inline bool //函数2
operator != (const complex& x, double y)
{
    return real (x) != y || imag (x) != 0;
}

inline bool //函数3
operator != (double x, const complex& y)
{
    return x != real (y) || imag (y) != 0;
}
//调用三种 非成员运算符 函数
{
	bitleef c1(2,1);  
	bitleef c2;  		//创建 c1 和 c2两个对象
	cout << (c1 != c2); //调用 函数1
	cout << (c1 != 2);  //调用 函数2
	cout << (0 != c2);  //调用 函数3
}	


文章来源:bitleef.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值