首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-10-08 
找工作笔试面试那些事儿(4)---C++函数高级特征C函数的高级特征重载(overloaded)、内联(inline)、const 和vir

找工作笔试面试那些事儿(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不应该出现在函数的声明中)。

热点排行