1. 运算符作为成员函数时,其左侧运算对象必须是运算符所属类的一个对象
首先明白一个基本概念,对于成员函数,其左侧运算对象必须是运算符所属类的一个对象。也就是说左侧的这个对象必须和运算符必须同属一个类,否则当其他类的对象调用该符号 << 时,在其他类内找不到该符号的成员函数。
该概念在C++Primer第五版14.1内解释过:
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