读书人

找工作笔试口试那些事儿(4)-C++函数高

发布时间: 2013-10-08 16:38:32 作者: rapoo

找工作笔试面试那些事儿(4)---C++函数高级特征
C++函数的高级特征

重载(overloaded)、内联(inline)、const 和virtual是C++独有而C不具有的四种机制。其中重载和内联机制既可用于全局函数也可用于类的成员函数,const 与virtual机制仅用于类的成员函数。重载和内联是一把双刃剑,用的好可以提高效率,精简程序;而一味滥用也会影响程序的效果。这里根据笔试面试中常碰到的问题,探究一下重载和内联的优点与局限性,说明应该不应该使用的场景。

1 函数重载 1.1 重载的定义和意义

在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,即函数重载,如下程序所示。但它们互相之间参数不同,这样便于记忆,提高了函数的易用性,这是C++语言采用重载机制的一个理由。 C++语言采用重载机制的另一个理由是:类的构造函数需要重载机制。因为C++规定构造函数与类同名,构造函数只能有一个名字,但有时候我们需要几种方法构造对象。

由于C++语言支持函数重载,才能将运算符当成函数来用,C语言就不行。我们要以平常心来对待运算符重载:

(1)不要过分担心自己不会用,它的本质仍然是程序员们熟悉的函数。

(2)不要过分热心地使用,如果它不能使代码变得更加易读易写,那就别用,否则会自找麻烦。

2)不能被重载的运算符

在C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。

(1)不能改变C++内部数据类型(如int,float等)的运算符。

(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。

(3)不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。

(4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。

6.5 关于内联函数 1)用内联取代宏代码

C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。

在C程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高了速度。使用宏代码最大的缺点是容易出错,由于宏是直接替代展开,预处理器在复制宏代码时常常产生意想不到的边际效应。例如

// 头文件class A { public: void Foo(int x, int y);} // 定义文件inline void A::Foo(int x, int y) { …} 


3)慎用内联

内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?如果所有的函数都是内联函数,还用得着“内联”这个关键字吗?内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜使用内联:

(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。

(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。

一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了inline不应该出现在函数的声明中)。

读书人网 >C++

热点推荐