不能重载的运算符:点、域、三目、内存
即. :: ?: sizeof
语法(若定义为成员函数):
返回类型 类名::operator op(参数表){……}
e.x. string Mclass::operater +(Mclass B)
{}
也可以用友元函数重载(尤其是对二元运算符可以满足交换性需求)
不能用友元函数重载的运算符:等括箭
即:=、()、[]、->
系统为类运算默认重载两个运算符:=(默认复制对象)、&(默认返回地址)
Attention:
可以重载负号
重载不能改变所需的操作数个数(如二元运算符只能操作两个数据)
来自C++标准文档的一些重载与编译规则:
重载运算符的编译器解释
一元:
成员函数:Obj.operator op()
友元函数:operator op(Obj)
二元:
成员函数:objL.operator op(objR)
友元函数:operator op(objL,objR)
++与–重载
原型与解释:
//A为类
//前置
//成员函数原型
A &A::operator++();
//成员函数解释
Aobj.operator++();
//友元函数原型
friend A&operator++(A&)
//友元函数解释
operator++(Aobj);
//后置
//成员函数原型
A &A::operator++(int)
//成员函数解释
Aobj.operator++(0)
//友元函数原型
friend A& operator++(A&,int)
//友元函数解释
operator++(A,0)
Attention:
不允许使用默认参数(如参数表中出现int x = 1)
不应使用伪参数,如:
Aobj++ 3;//非法
Aobj++(3);//合法
重载赋值运算符
Attention:只能重载为成员函数,且不能被继承
连续赋值会产生匿名对象复用的现象
若用户未重载赋值运算符,则在对象赋值时系统提供默认的赋值重载函数,
其原型为:constexpr A &A::operator=(const A &)
复制构造函数与重载赋值运算符函数都是对数据成员的复制,但执行时机不同,前者用于对象初始化,后者用于修改对象数据
重载()与[ ]
[ ]:
调用形式:对象[表达式]
():
调用形式:对象(表达式表)//表达式可为空
函数需作为左值时,需返回引用
重载流
在规范情况下被声明为友元,为保证istream>>obj的写法有效,但也可为声明成员函数,但不建议使用
格式:e.x.
//A为类名
istream& operator>>(istream&input,A &Aobj)
//返回流的地址有利于实现连续输入
类型转换函数
形式:classX::operator Type(){}
Attention:
1、必须为成员函数,不能为友元函数
2、无参数和返回类型,但函数体内必须返回Type类型值
3、编译时程序发现参数类型不匹配,可以实现自动类型转换(隐式转换)