对于二元运算符,aa@bb可以理解为aa.operator@(bb),或者理解为operator@(aa,bb)。对于一元运算符,无论它是前缀的还是后缀的,都可以定义为无参数的非静态成员函数,或者定义为取一个参数的非成员函数。对任何前缀一元运算符@,@aa可以解释为aa.operator@()或者operator@(aa)。对任何后缀一元运算符@,aa@可以解释为aa.operator@(int)或者operator@(aa,int)
一个运算符函数必须或者是一个成员函数,或者至少有一个用户定义类型的参数(重新定义运算符new和delete的函数则没有此项要求)
class Tiny
{
char v;
public:
//转换到int的函数,作为转换目标的类型 是运算符名字的一部分,不能作为转换函数的返回值类型而重复写出
operator int() const { return v; }
}
friend声明可以放在类声明中的私用部分或者公用部分,放在哪里都没有关系
通过将构造函数声明为explicit(显示)的方式可以抑制隐式转换。也就是说,explicit构造函数必须显示调用。
函数operator[]()必须是成员函数,operator()()必须作为成员函数,operator->()必须是成员函数
class Ptr
{
X* operator->();
};
void f(Ptr p)
{
p->m = 7; //(p.operator->())->m = 7
}