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非静态成员变量

 

posted on 2024-02-07 16:08  新西兰程序员  阅读(26)  评论(0编辑  收藏  举报