内联函数

来源:互联网 发布:视频网站程序 linux 编辑:程序博客网 时间:2024/05/16 06:31

在C++中我们经常把一些小的操作也定义成函数,比如:

const string &shorterString(const string &s1,const string &s2){return s1.size()<s2.size()?s1:s2;}

这样做的好处是:
1.阅读和理解一个函数调用比阅读和理解一条表达语句要容易的多
2.如果需要修改,那么只用修改函数,而不用在使用语句的地方修改每一次语句。
但是,这样做也有缺点:
调用函数比求解表达式慢很多,因为函数调用时,先要保存寄存器,并在函数返回时恢复寄存器;还要复制实参,程序还要转向另一个新的位置等等。

内联函数就可以避免上述缺点,它是得程序在调用点“内联地”展开:

cout<<shorterString(s1,s2)<<endl;
在编译时展开为:
cout<<(s1.size()<s2.size()?s1:s2)<<endl;

 

这一点跟宏的作用类似。

怎么定义内联函数呢?很简单,只需要在定义时添加关键字inline即可:

inline const string &shorterString(const string &s1,const string &s2){return s1.size()<s2.size()?s1:s2;}

通常,我们把比较小(3~5行)而又反复调用的函数定义成类联函数:在内联函数内不允许用循环语句和开关语句。 如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码;大多数编译器也不支持递归函数的内联。对于比较大的函数还是老老实实的调用吧。

注意:内联函数应该放在头文件中,而不像一般的函数,在头文件中声明,而在对应的源文件定义。原因是因为内联函数调用时,对编译器必须是可见的,这样才能在调用点展开。

 

在类中,我们也经常定义一些内联函数。典型的,为了隐藏数据,类中会定义set函数和get来访问数据,这些函数比较短小,而且使用频繁,所以最好定义为内联函数。

在类中定义内联函数有3种办法:

1.直接在类的函数体中定义(不仅仅是声明)的函数自动处理为内联函数。

2.在声明函数名时使用inline来表明它是一个内联函数

3.在定义函数时使用inline表明它是内联函数。

举一个小例子:

class Student{public:typedef int score;score getMath(){return math;}inline score getEnglish();score getChinese();private:string name;int schoolNumber;score math;score english;score chinese;};Student::score Student::getEnglish(){return english;}inline Student::score Student::getChinese(){return chinses;}


 

这三种方法均可。

 程序中还有一小点需要注意,就是我使用了typedef int score;来隐藏了“分数”具体实现的细节。而且把它放在public,是得类的使用者通过作用域操作符::使用这个数据类型。

原创粉丝点击