宏定义#define和const常量的区别
(1)宏定义#define相当于字符替换,const为常量声明
(2)宏定义#define做预编译器处理,const为编译器处理
(3)宏定义#define做无类型安全检查,const做有类型安全检查
(4)宏定义#define不分配内存,const要分配内存
(5)宏定义#define存储在代码段,const存储在数据段
(6)宏定义#define可通过#undef取消,const不可以取消
static的作用
(1)修饰普通变量,修改变量的存储区域和声明周期,使变量存储在静态区,在main韩束运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值那么系统就用默认值初始化它
(2)修饰普通函数,表明函数的作用范围,仅在定义该函数的文件内才能使用,在多人开发项目时,为了防止与他人命名空间的函数重名,可以将函数定义为static
(3)修饰成员变量,修饰成员变量使所有的对象只保存一个该变量,而且不需要生成对象就可以访问该成员
(4)修饰成员函数,修饰成员函数使不需要生成对象就可以访问该函数,但是在static函数内不能访问非静态成员
this指针
(1)this指针是一个隐含于每一个非静态成员函数中的特殊指针,它指向调用该成员函数的那个对象
(2)当对一个对象调用成员函数时,编译程序先将对象的地址赋值给this指针,然后调用成员函数,每次成员函数存取数据成员时,都隐式使用this指针
(3)当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针
(4)this指针被隐含地声明为className *const this,这意味着不能给this指针赋值;在ClassName类的const成员函数中,this指针的类型为:const ClassName * const,这说明不能对this指针所指向的这种对象是不可以修改的,即不能对这种对象的数据成员进行赋值操作
(5)this并不是一个常规变量,而是一个右值,所以不能取得this的地址,即不能&this
(6)在这三种情况下需要显式引用this指针:
实现对象的链式引用
为避免对同一对象进行赋值操作
为实现一些数据结构时,如list
inline内联函数
特征:
(1)内联函数里面的内容被写在调用内联函数处
(2)不执行进入函数的步骤,直接执行函数体
(3)比宏多了类型检查,真正具有函数特性
(4)编译器一般不包含循环、递归、switch等复杂操作的内联函数
(5)在类声明中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数
编译器对inline函数的处理步骤:
(1)将inline函数体复制到inline函数的调用点处
(2)为所用inline函数中的局部变量分配内存空间
(3)将inline函数的输入参数和返回值映射到调用方法的局部变量空间中
(4)如果inline函数有多个返回点,将其转变为inline函数代码块末尾的分支
优点:
(1)内联函数同宏函数一样将在被调用处进行代码展开,省去了参数压栈、栈帧开辟与回收,结果返回等,从而提高程序运行速度
(2)内联函数相比宏函数来说,在代码展开时,同普通函数比较,会做安全检查或自动类型转换,而宏定义则不会
(3)在类中声明同时定义的成员函数,自动转化为内联函数,因此内联函数可以访问类的成员变量,宏定义不能
(4)内联函数在运行时可调式,而宏定义不可以
缺点:
(1)内联函数是以代码膨胀为代价,消除函数调用带来的开销。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获就会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间
(2)inline函数无法随着函数库升级而升级,inline函数的改变需要重新编译,不像non-inline可以直接链接
(3)内联函数只是对编译器的建议,是否对函数内联,决定权在于编译器