C++基础-this指针/内联函数

序言

本文学习 this指针 + inline内联函数


1. this指针

  • 什么是this指针

    • 通常在类定义时要用到类型变量自身,这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this指针来使用变量自身

    • struct、class和int char等一样,都是变量类型,比如类class myclass,用它来声明变量myclass my,则my的this指针就是指向my的指针,this的类型就是myclass *类型

  • this指针原理

    • this指针作用域在类内部,在类的非静态成员函数访问类的非静态成员时,编译器会自动将对象本身的地址作为一个隐士参数传递给函数

    • 在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用,编译器在编译时加上this指针作为非静态成员函数的隐士形参

    • this指针并不是对象的一部分,this指针保存当前对象的内存地址,每个对象的this指针都是常量指针,不允许改变this中保存的地址,this指针时刻指向实例对象本身

  • this指针的使用

    • [1] 在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;
    • [2] 另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。


2. inline内联函数

  • 什么是inline内联函数

    • 与宏定义类似,编译器将使用相应的函数代码替换函数调用

    • 在C++的类成员中,如果成员函数的函数体本身结构不复杂,代码量也较少的时候,直接在定义这个函数的时候就完成该函数的实现,这样的一个过程在C++类中会被默认当做内联函数

class A
{
    public:
        int a;
        int b;
        int addresult()
        {
            return a + b;
        }
    private:
};
  • inline内联函数的原理

    • 内联函数是C++的增强特性之一,用来降低程序的运行时间。当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。

    • 通过inline声明,编译器首先在函数调用处使用函数体本身语句替换了函数调用语句,然后编译替换后的代码。因此,通过内联函数,编译器不需要跳转到内存其他地址去执行函数调用,也不需要保留函数调用时的现场数据

  • inline内联函数的分类
    内联函数主要分为两种:类内内联函数 + 类外全局内联函数

    • 定义函数时在函数前加上“inline”关键字声明函数
//类内
//见上面的例子:不用显示的去声明

//类外
class A
{
    public:
        int minus(int a, int b);
};

inline int A::minus(int a, int b)
{
    return (a - b);
}
  • 为什么要使用inline内联函数

    • 使用内联函数目的是为了消除函数调用上的开销,频繁的调用函数会增加内存上的开销
  • inline内联函数与宏定义的区别

    • 在传统C中对减少调用引起的内存消耗的方法是宏定义。但是宏定义存在着很多的问题:
    • [1] 宏定义是预处理器来执行命令的,而不是编译器。而预处理器执行的宏命令是对其进行单纯的词语替换,没有任何的语法分析可言

    • [2] 在使用宏命令的时候往往会引发一些很容易被忽略掉的错误。比如变量多次递增等

    • [3] 宏定义是强制的内联展开,可能会污染所有的命名空间和代码;而内联声明只是对编译器的一种建议,由编译器来决定是否采用

    • 《Effective C++》一书中建议“尽量少用预处理器,而多用编译器”。

  • inline内联函数使用场合

    • 当对程序执行性能有要求时

    • 当想宏定义一个函数时,果断用内联函数

    • 在类内部定义的函数会默认声明为inline函数,有利于类实现细节的隐藏

  • 注意事项

    • 内联声明只是一种对编译器的建议,编译器是否采用内联措施由编译器自己来决定。甚至在汇编阶段或链接阶段,一些没有inline声明的函数编译器也会将它内联展开。

    • 所有类内实现的函数都默认声明为内联函数,不用显示声明inline

    • 虚函数不允许内联

    • 内联函数定义可以放到头文件中,但并非所有头文件中定义的函数都是内联函数

    • 内联函数是用空间换时间的做法,应尽量定义成频繁调用且功能简单的函数,简化函数体,如果函数体过长或者有多条循环语句、条件语句或递归,则不宜用内联函数

    • inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”,inline应与函数定义(实现)体放在一起

    • 由于内联函数在调用的时候直接暴露出了函数体,可能造成泄漏函数功能的现象



Acknowledgements:
http://www.cnblogs.com/liushui-sky/p/5802981.html
http://blog.csdn.net/helinlin007/article/details/8112091
http://www.cnblogs.com/QG-whz/p/4641479.html

2017.09.30

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值