什么是this指针?
- this 是 c++中的一个关键字,也是一个常量指针,指向当前对象(所谓的当前对象,就是正在使用的对象),也就是当前对象的首地址。通过this指针,可以访问当前对象的成员变量和成员函数。
- this指针的类型 类类型 * const
- this指针并不是对象本身的一部分,不会影响sizeof的结果
- this的作用域在类成员函数的内部
- this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递
- 只有在类的非静态成员函数中才可以使用this指针
注意:
- this 是常量指针,它的值不能被修改
- this 只能在成员函数内部使用
- 只有对象被创建后this才有意义,因此不能再static成员函数中使用
this 它是成员函数和成员变量之间的桥梁
_thiscall调用约定
- _thiscall只能用在类的成员函数上
- 参数从右向左压栈
- 如果参数个数确定,this指针通过ecx传递给调用者,如果参数不确定,this指针在所有的参数压栈后压入堆栈
this指针是否可以为空?
1 ) NULL对象指针可以调用成员函数
2)通过对象调用成员函数,对象的指针会被传入函数中,指针名称为this
3)NULL对象指针调用成员函数时,只要不访问此对象的成员变量,则程序正常运行
4)NULL对象指针调用成员函数时,一旦访问此对象的成员变量,则程序崩溃
类的静态成员
声明为static的类成员,称为类的静态成员
特性:
- 类的静态成员为所有类对象所共有,不属于某个具体的实列
- 类的静态成员,即可用类名::静态成员或者对象.静态成员名来访问
- 类的静态成员变量必须在类外定义,定义时不需要添加stdtic关键字
- 类的静态成员函数没有默认的this指针,所以在静态成员函数里面不能使用任何非静态成员
- 也有访问限定符,也具有返回值,const修饰符等
注意 1,静态成员函数可以调用非静态成员函数吗?
类的静态成员函数的函数形参中没有默认的this指针,导致不能调用具体实例对象的成员。
如果有需求:可以采用如下几个方法?
a>类中实例化对象,在创建的时候把this指针赋值给那个静态成员
b>类外实例化对象,全局对象
c>类外实例化对象,传参数(看自己需要使用值、地址、引用)
const修饰类成员
在C语言中const修饰的变量具有常属性,但仍然为一个变量
在c++中const定义的变量是一个常量
使用场景 :
- 修饰形参,一般和引用同时使用
- 修饰返回值
- 修饰类数据成员,必须在构造函数的初始化列表中初始化
- 修饰类成员函数,实际修饰隐含的this,表示在类中不可以对类的任何成员进行修改
- const修饰的成员函数中要对类的某个数据成员进行修改,需要在需要修改的数据成员前加上mutable
注意 1,const对象可以调用非const成员函数和const成员函数吗?
const对象不可以调用非const成员函数,可以调用const成员函数(const对象定义的函数体里面不能对当前对象进行修改)
2,非const对象可以调用非const成员函数和const成员函数吗?
非const对象可以非const成员函数,也可以调用const成员函数。
3,const成员函数可以调用其他const成员函数和非const成员函数吗?
const成员函数内可以调用const成员函数,但是不能调用非const成员函数(普通成员函数)
4,非const成员函数可以调用其他const成员函数和非const成员函数吗?
非const成员函数内可以调用const成员函数,也可以调用非const成员函数
注意 :构造函数不能用const修饰?
const修饰类的成员函数,实际上就是在修饰当前对象,构造函数没有调用,则当前对象不存在,也就不能修饰构造函数的指针,只知道一块空间的位置,初始化列表没有执行。没有初始化,不知道当前对象具体占了几个字节。a、构造函数没有执行,当前对象不存在;b、构造函数里面,创建成功之后需要放一些初始值,用const对象修饰以后不能给对象放初始值。
内联函数
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数 的地方展开(替换掉,内联函数替换发生在编译器编译的阶段而宏替换发生在预处理阶段),没有函数压栈的开销,内联函数提升程序运行的效率
- inline是一种以空间换时间的做法,省去调用函数额开销。所以代码 很长或者有循环/递归的的函数不适宜使用内联,可以 提高运行效率。
- inline对于编译器而言只是一个建议,编译器会自动优化,如果定义 为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联
- inline必须函数定义放在一起,才能成为内联函数,仅将inline放在 声明前是不起作用的
- 定义在类内的成员函数默认定义为内联函数