1、运算符重载
函数格式:
operatorop(argument-list)
operator+() ; 重载+运算符
operator*() ; 重载运算符
重载运算符,对类对象之间运算等 很方便,直接可以用 + - / 等调用
eg:
//申明
class Ctime
{
Ctime operator+(const Ctime &t)const;
==
Ctime sum(const Ctime &t)const;
};
//使用
Ctime a[2] = { Ctime(3,30),Ctime(6,50) };
Ctime b=a[1]+a[0];
//== a[1].sum(a[0]) == a[1].opertor+(a[0])
2、友元函数
友元函数不是 ???类的成员函数,但是可以访问类的私有变量
eg:
//类成员重载函数
Ctime operator*(double m);
//使用时,必须如下
Ctime a,b;
b=a*2.5;//左边为Ctime 对象,如果换位就会出错,b=2.5*a;无效;如图a
//解决这个问题,就需要申明一个非类成员的函数
Ctime operator*(double m,const Ctime &t);
但是他不能访问私有变量,故只能声明成为友元函数
//友元函数
friend Ctime operator*(double m, const Ctime &);//这个可以写在类里面就可以访问 私有变量了
详细代码见附录
3、重载运算符;成员、非成员
eg:Ctime operator+(const Ctime &t)const;
Ctime operator+(const Ctime &t,const Ctime &t);
- 区别一: 成员函数,可以用this指针隐式传递,非成员函数会多一个参数,只能显示传递
*区别二:非成员函数不能加限定符,(参数当让可以),返回值等都不行。
4、转换函数
表示方法: operator + typeName();
转换函数是类的方法;不需要参数,需要通过类对象来调用,从而告知函数要转换的值
放在类里面,拥有this指针,能够访问私有成员
为了保险起见;一般都会添加 explicit 防止不必要的隐式转换
过多的转换函数容易导致 二义性,隐式太多,导致编译器不知道执行哪个函数
更多详情见附件
链接:https://pan.baidu.com/s/1SqG81feKfW_PkUDG9Hnk6w
提取码:lcpk