重载
函数重载的话意味着一个函数有多个同名形式。通过参数的不同来辨别,C++区别不同的同名函数靠的就是参数,而返回值是无法辨别因为调用一个函数的时候我们不一定会用它的返回值。
当心隐式类型转换导致重载函数产生二义性
当output写0.5的时候,编译器不知道该将0.5转换成int还是float类型参数。
成员函数重载、覆盖与隐藏
成员函数的重载、覆盖与隐藏很容易混淆。
(1)重载和覆盖
成员函数被重载的特征:
<1>相同的范围(同一个类中)
<2>函数名字相同
<3>参数不同
<4>virtual关键字可有可无。
覆盖是指派生类函数覆盖基类函数,特征是:
<1>不同的范围,分别位于派生类与基类
<2>函数名字相同
<3>参数相同
<4>基类函数必须有virtual关键字
(2)令人迷惑的隐藏规则
这里的隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
<1>如果派生类的函数与基类的函数同名,但是参数不同,此时不论有无virtual关键字,基类的函数将就隐藏!
<2>如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字,此时基类的函数被隐藏
参数的缺省值
(1)参数缺省值只能出现在函数的声明中,而不能出现在定义体中。规定在申明好处就是修改方便,用户容易得知。
(2)如果函数有多个参数,参数只能从后向前挨个儿缺省,否则将导致函数调用语句怪模怪样。参数的缺省值将可能导致重载函数产生二义性。
不能被重载的运算符
(1)不能改变C++内部数据类型,如int,float
(2)不能重载‘.’,因为‘.’在类中任何成员都有意义,已经成为标准用法。
(3)不能重载目前C++运算符集合中没有的符号,@#等,难以理解同时难以确定优先级。
(4)已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。
函数内联
(1)用内联函数取代宏代码,C++支持内联,其目的是为了提高函数的执行效率。
(2)内联函数关键字inline必须与函数定义体放在一起才能使函数成为内联。
慎用内联
既然内联可以提高效率,为何不把所有的函数定义成为内联函数。当然是不行的!
内联是以代码膨胀复制为代价,仅仅省去了函数调用的开销。从而提高效率。因此要是每一处都做内联函数,那么将使得程序总代码量增大,消耗更多的内存空间,一下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时候要比函数调用的开销大。