C++中的static关键字和this指针
C++中的static关键字用来修饰静态成员变量和静态成员函数, static定义的类的静态成员(成员变量和成员函数) ,它会有一块单独的存储区。 当我们把这个类实例化时,会为类实例化的对象来分配空间,显然此时给对象分配的内存空间不包括静态成员所占的空间。
特别要注意,静态成员变量必须在类中声明,在类外定义 =》 我们来看个例子
class TestClass {
public:
int num; //普通成员变量
static int testField; //在类里面声明静态成员变量 testField };
//在类外面定义静态成员变量,这个时候,不需要再次加static关键字
int TestClass::testField = 10; //类外定义+初始化 静态成员变量testField
访问静态成员变量有两种方式
第1种:直接通过类来访问 类名::静态成员变量 =》 比如上面的 TestClass::testField
第2种: 通过类实例化后的对象来进行访问 对象名.静态成员变量 => tc1是TestClass的一个实例化对象,我们可以这样访问 tc1.testField = 20;
static也可以用来修饰函数,这种函数称为静态成员函数. 在C++中,普通成员函数(没有用static修饰的函数)都会有一个隐藏的this指针,来代表当前对象。 比如我们对一个类进行实例化成对象后,这个对象的非静态成员函数(普通成员函数)中会有一个隐藏的this指针,系统会自动把该对象的起始地址赋给该成员函数的this指针, 我们通过这个隐式的this指针,就可以对这个对象的其他成员进行访问. 但是对于静态成员函数而言,它有自己独立的静态存储空间,它不属于类的任何一个实例化对象,因此C++规定静态成员函数中没有这种隐式的this指针(面试经常考的题). 所以,静态成员函数中没有this指针来指向类的实例化对象,自然而然,它也就无法对一个实例化对象中的非静态成员进行访问,它只能调用类中的static成员函数
也就是说static静态成员函数,C++编译器是不会为它增加一个this 指针的。 也正因为没有这个this指针,所以static成员函数无法调用处理类中的non-static非静态成员变量