对比于C 语言的函数,C++增加了重载(overloaded)、内联(inline)、const 和virtual
四种新机制。其中重载和内联机制既可用于全局函数也可用于类的成员函数,const 与
virtual 机制仅用于类的成员函数。
1.重载
重载是如何实现的?
同名函数,只是检查函数参数个数、类型、顺序。无法通过返回类型来判断其他都相同的函数。
EX:C函数声明如: void foo(int x, int y);
由于C中不存在重载,C编译器翻译后在库中的名字为_foo,而C++编译器翻译就会像_foo_int_int的名字来支持函数重载和类型安全连接。
类成员调用全局函数应加:: EX: ::print()即调用全局函数
2.重载、覆盖与隐藏
重载特性:同一个类中、函数名字相同、参数不同、virtual关键字可有可无。
覆盖特性:派生类覆盖基函数。
不同类:基类与派生类中、函数名字相同、参数相同、基类函数必须有virtual关键字。
隐藏特性:指派生类函数屏蔽了与其同名的基类函数。分为如下2种情形:
A.派生类函数与基类函数同名,但参数不同,此时不管有无virtual关键字,基类函数被隐藏。(注意与重载别混淆)
B.派生类函数与基类函数同名,参数也相同,但是基类没有virtual关键字,此时基类函数被隐藏(注意与重载别混淆)
3.参数的缺省值
一些参数的值在每次调用时都相同,书写这样的语句会使人厌烦。缺省值由编译器自动插入。缺省值出现在函数的声明中。参数只能从后向前挨个儿缺省。
4.运算符重载
Complex operator +(const Complex &a, const Complex &b);
5.函数内联
用内联取代宏代码:目的是提高执行效率。
在C中使用宏提高执行效率。宏本身不是函数。预处理使用复制宏代码方式代替函数调用,省去了参数压栈、生成汇编语言的call调用、返回参数、执行return语句。但是宏可能产生边际效应出错。
在C++中内联函数代码放在符号表中,调用内联函数时,编译器先进行类型安全检查、自动类型转换、替换函数调用。内联函数比宏安全。==宏的效率+安全性。其中assert是宏,在debug和release版本中,不会引起内存、代码的改变(即无副作用)。
内联必须与函数定义一起使用才生效,若是声明中内联无效。是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
类中的成员函数自动生成为内联函数,即inline是省略没写。所以C++代码执行效率高。
不宜使用内联的情况:代码较长,复制代码时间较长。