转换函数:(没有返回类型) operator 类型(无参)const{return (类型) 。。。} 一般会加const,转换类型只改变类型不改变数值。 下面的d=4+f 编译器的编译过程是先去找友元操作符重载函数把+重载为左边参数是double类型,右边参数是fraction类型,没找到,又去找能不能把fraction转为double的函数,结果找到了,就直接调用了。
只要认为合理,可以写多个转换函数,只要让编译器像下面那个例子一样认得就可。
无explicit单实参构造函数。如下,虽然重载了+,但4不是fraction类型的,就调用无explicit构造把4转化为fraction(4,1),也就是1分之4.上面的是把fraction类型转换为其他类型,这里是把其他类型转换为fraction类
如下,编译器有两条路可以走,一条是通过fraction(4,1)把4转换为fraction类然后相加然后调用重载后的+把4和f相加,第二条是通过把f转换成double类型然后与4相加,结果再通过fraction()构造函数转换成fraction类型。 编译器不知道怎么选择,故报错。
基于以上不人性化的内容引入了关键字explicit的概念
关键字explicit用到的地方百分之99都是转换函数,其他基本用不到
如下,编译器不会自动的调用转换函数
智能指针(pionter-like classes 粗俗翻译是像指针的类):*sp时通过左边的重载使得他变成了*px,而sp->method()如果说重载->使得sp变成了px,那么这个->已经消耗了,从而使sp->method()变成了pxmethod,语法就不通了啊,侯老师是这么解释的,->这个操作符很特别,它重载之后会继续作用下去。
关于迭代器:链表容器的迭代器关于智能指针的应用
仿函数(function-like classes 像函数的类):就是在类或结构体内重载()使得对象看起来像函数