this指针
1.this指针是一个隐含于每个非静态成员函数中的特殊指针,他指向调用该成员函数的那个对象
2.当对一个对象调用成员函数时,编译程序先将对象的地址付给this指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用this指针。
3.当一个成员函数被调用时,自动向他传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针
4.this指针被隐含的声明为:ClassName *const this,这意味着不能给this指针赋值;在ClassName 类的const函数中,this指针的类型为 const ClassName *const 这说明不能对this指针所指向的这种对象是不可修改的
5.this不是一个常规变量,而是一个右值,所以不能取得this的地址
6.使用场景:
i:为实现对象的链式引用;
ii:为避免对同一对象赋值操作,
iii:在实现一些数据结构,如list;
——inline内联函数
特征:
——相当于把内联函数里面的内容写在调用内联函数处
——相当于不用执行进入函数的步骤,直接执行函数体
——相当于宏,却比宏多了类型检查,真正具有函数特性。
——编译器一般不内联包含循环、递归、switch等复杂操作的内联函数
——在类声明中定义的函数,除了虚函数的其他函数都会自动的隐式的当成内联函数
使用
// 声明1(加 inline,建议使用) inline int functionName(int first, int second,...); // 声明2(不加 inline) int functionName(int first, int second,...); // 定义 inline int functionName(int first, int second,...) {/****/}; // 类内定义,隐式内联 class A { int doA() { return 0; } // 隐式内联 } // 类外定义,需要显式内联 class A { int doA(); } inline int A::doA() { return 0; } // 需要显式内联
编译器对内联函数的处理
1.将内联函数复制到inline函数调用点处
2.慰所用inline函数中的局部变量分配内存空间
3.讲inline函数的输入参数和返回参数映射到调用方法的局部变量空间中
优点
——内联函数同宏函数一样将在被调用处进行代码展开,省去了参数压栈,栈帧开辟与回收,结果返回等,提高程序运行速度。
——内联函数相比宏函数,在代码展开时,会做安全检查或自动类型转换,而宏定义则不会
——在类中声明同时定义成员函数,自动转化为内联函数,因此内联函数可以访问累的成员变量,宏定义不能
——内联函数在运行时可以调试,宏定义不能
缺点
1.代码膨胀。内联是以代码复制为代价,消除函数调用带来的开销。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。以空间换时间
2.内联函数无法随着库函数的升级而升级。
3.是否内联,程序员不可控。内联函数只是对编译器的建议。是否对函数内联,取决于编译器;
虚函数可以是内联函数吗?
答:虚函数可以是内联函数,内联是可以修饰虚函数的,但当虚函数表现多态性的时候不能内联。
内联是在编译期间建议编译器内联,而虚函数的多态性在运行期。编译器无法知道运行期掉用了那个代码,因此虚函数表现为多态性时(运行时)不能内联
3.inline virtual唯一可以内联的时候是:编译器知道所调用的对象是哪个类(如:Base::function(),加作用域),这只有在编译阶段具有实际对象而不是对象的指针或引用时才会发生