c++中得内联函数和宏定义

  在c++中内联函数是对宏定义一种改造,因为利用内联函数取代宏定义得好处是:

 1、可进行类型安全检查或自动类型转换、

  例如:在c语言中,常用预处理器语句#define来代替一个函数定义。例如:

       #define MAX(a,b) ((a)>(b)? (a):(b))

            该语句是在程序中每个出现Max(a,b)函数调用得地方,都被后面得表达式((a)>(b)?(a):(b))所替代

            不难发现其实对参数a,b来说都没有数据类型得定义,缺少一些安全性检查。

 

2、提高程序的运行效率

          对于c++中一般得函数,被程序调用得时都需要为该函数开辟空间进行函数得压栈、出栈等所带来得开销,而

内联函数像宏一样被展开,调用内联函数的时候,由编译器负责把内联函数的函数体代码块替换到内联函数被调用的

地方,这一点与宏替换很相似;取消了函数参数压栈、出栈所带来的开销,从而减少了函数调用开销,提高程序得运

行效率。

           所以,内联函数在项目开发中经常用到,所以关于内联函数得使用应用如下:

  第一种 、内联函数得声明和函数体得定义在一起

  例如:

inline int Max(int a, int b){return  ((a > b) ? a : b)};

 

第二种、c++类得成员函数也可以被定义为内联函数

    class Student{

    private:

    int nID;

    int nAge;

    float fScore;

 

  public:

    void setID(int nid){ nID = nid; }    //该成员函数默认自动为内联函数(隐式定义内联函数)

    int getID(void){ return nID; }       //该成员函数默认自动为内联函数(隐式定义内联函数)

    inline void setAge(int nage) { nAge = nage; }   //显式定义内联函数

    inline int getAge(void) { return nAge; }        //显式定义内联函数

    void setScore(float fscore);         //类定义体内没有声明为内联函数;

    float getScore(void);                //类定义体内没有声明为内联函数;

 }

inline void Student::setScore(float fscore){ fScore = fscore; } //类定义体外实现为内联函数;

inline float Student::getScore(void) { return fScore; }         //类定义体外实现为内联函数;

 

  注意:(1)C++中,在类定义体内部定义了函数体的成员函数,被编译器默认为内联函数,而不管这个函数头前面是

          否有关键字inline,比如:setID()、getID()、setAge()、getAge();

            (2)以把实现在类定义体外部的成员函数定义为内联函数,这个时候在类定义体中只有成员函数头的声明,而

         其实现是在类定义体外部,比如:setScore()和getScore();

内联函数的局限性:

        1、由于内联函数与宏一样也是实现为代码替换,所以定义为内联函数的函数体不宜过大,如果函数体过

大,则某些普通的编译器就会放弃内联方式,而改用调用普通函数的方式,这样就失去了内联函数的意义了;所以,

内联函数的函数体代码不宜过大,一般就是3---4行代码即可;

       2、由于内联函数是编译器在编译阶段进行函数体展开的,所以,这就把类的内联函数的定义与实现都必须在

声明类的那个头文件中,而不能放在实现类的那个cpp文件中;这一点与模板template<>的特性相似

         内联函数得调用可下载

实例代码可下载:点击打开链接

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值