C++之static、const、static const修饰符

来源:互联网 发布:刀剑神域第二季 知乎 编辑:程序博客网 时间:2024/06/05 00:43

参考自C++中static、const、static const修饰变量作用详解


首先我们需要先了解程序运行期间的内存分区
1.代码区:存放CPU指令码。
2.常量区:存放只读常量,该区只读,不可写。
3.静态区:存放静态变量。该区在程序编译完成后就决定了其大小,程序运行期间该区的大小不会变。该区可读写。
4.动态区:又分为堆区和栈区,程序运行期间其大小处于动态变化中。处于该区的变量也会时而被创建时而被销毁。

static关键字

经过static修饰的变量会作为类的属性而不是实体属性存在。
static修饰的变量作为程序运行时的静态变量,存在于内存的静态区,静态区的数据初始化工作由操作系统在加载完程序后执行main函数前进行。操作系统在加载完程序后,将常量区中存放的变量初值复制给静态变量,完成其初始化。
static修饰成员变量
static修饰的成员变量通过int ClassName::value=1这种方式进行初始化。此时不再需要static 关键字。程序运行期间也可以对变量进行赋值操作。
static修饰的公有的成员变量,以类名::成员变量名方式调用(正常方式),也可用对象名.成员变量名方式调用(不推荐)
static修饰成员函数
static修饰的公有的成员函数,以类名::成员函数名方式调用(正常方式),也可用对象名.成员函数名方式调用(不推荐)
实例代码如下:

#include <iostream>using namespace std;class A{public://如果要在类外部调用,就必须是public    static int a;    static void test(){        cout << "test" << endl;    }};int A::a = 10;//对静态成员变量初始化int main(int argc, char *argv[]){    A a1;    cout << a1.a << endl;    cout << A::a << endl;    a1.test();    A::test();}

const关键字

  • const修饰成员函数
    在函数内不能修改对象任何成员。
  • const修饰对象
  • const修饰成员变量
    经过const修饰的属性,顾名思义是指常量。而且也只能在构造函数的初始化列表中初始化,运行期间将不能再对const属性进行修改。值得注意的是,虽然经过const修饰,但是因为变量属于实体属性,而实体对象存在于动态区,所以const属性也属于动态区,所以可以通过取址直接操作指向的内存的值,以绕过编译器对其只读的限制检查。
  • c语言中const的用法

static const关键字

static const 和 const static 含义相同。
static const有两种用法,一种是作为预编译声明,一种是作为类的静态常量属性(未使用过)。
当作为预编译声明时,static const 属性必须在声明时即指定值,而且类型仅限基本数据类型。用法如下:

class A{    static const int a =1;}

此时相当于C语言中的 #define a 1 宏定义了一个宏变量a,但是C++的这种方式比C的#define的优势在于,可以对类型进行检查和限制,减少了编译期间因为类型隐士转换而造成的潜在风险。
此时的 const static常量既不存在于动态区也不存在与静态区(应该是存在于常量区或代码区。。。),而是由编译器在编译期间就直接进行了值替换。也因为这个原因不可以对其进行取地址操作,因为他根本没有地址。

总结

  • static const 作为预编译声明使用时,相当于C的#define,但是需要编译器进行类型检查,保证了程序的健壮性。此时其只能用基本数据类型。
  • static const 作为类的常量属性,因为常量区是在程序真正执行代码前进行初始化,所以其也必须是基本数据类型。
  • static const 和const的区别是:const声明的只读变量,在程序运行期间不能对其进行写操作,写操作将无法通过编译,也就是说它是通过编译器控制的只读,所以如果想下面这样:

    A a;int * pa = (int*)&a.a;*pa = 2;

    则可以绕过编译器修改他的值。static const属性虽然也可以取址,但是对其写操作将会导致程序崩溃。因为static const 存在于常量区,而const存在于动态区。

  • static const 和 static的区别是,static 存在于静态区,该区可以进行写操作,其初始化的值也会存在常量区,程序启动后由操作系统从常量区取值赋值给static变量。

原创粉丝点击