深入理解cpp-static
摘要
本文将介绍C++中常见的关键字static
C++内存管理
开始之前,我们需要了解C++的内存管理模型。如下图所示:
由上至下,分别是栈、未使用的内存、堆、全局数据区、常量区和代码区。其中栈的增长方向为由高地址向低地址增长,局部变量存放在栈中,而堆和其他内存区域都是优先存放在低地址区域,向高地址增长。动态分配的内存,例如malloc和calloc,存放在堆区。全局数据区和常量区就是通常所说的data区。其中全局数据区就用来存放全局变量和static静态变量。常量区就用来存放常量,最后的代码区用来存放函数体的二进制代码。
static修饰局部变量
static修饰的局部变量存储在全局数据区,不会随着函数的结束而释放,在程序结束时才释放。
static修饰的局部变量只在编译时初始化,如果没有定义,则默认初始化为0。因为所有定义在全局数据区的未定义变量都会被初始化未0。
static修饰全局变量
static修饰的全局变量或者函数会变为内部链接,即仅本文件内可以访问static的变量和函数。 通常来说,一个文件内的定义的函数和变量可以被其他文件使用,但是static修饰后仅本文件内可以使用。
static修饰类成员
首先,类的静态成员为所有类对象共享,不属于任何一个具体的对象。
另外,由于静态成员是在程序编译时就进行了初始化,而类的其他成员的内存是运行时动态分配的,所以在静态成员变量进行定义时,必须在类外进行定义,同时需要注意,定义时,不需要加staic修饰,例如:
1 | class A{ |
由于静态成员并不属于任何一个对象,所以静态成员函数也没有隐藏的this指针,函数中也不能访问非静态成员,但是非静态成员函数可以直接访问静态成员函数。
同时,static成员函数不能被申明为const和虚函数
不能申明为const很好理解,const成员函数的目的就是为了该函数不能修改类内的成员,static成员函数显然不能这么做
而类的虚函数是通过虚函数表进行访问,虚函数表通过this指针进行访问,所以static成员函数不能设置为虚函数。