C++ 中static 关键字用法可以从两个方面来区分,一个是面向过程,另一个是面向对象。面向过程有三种用法,面向对象有两种用法。下文将详细讲解。
用法详解(从作用域,生命周期角度来解释)
面向过程
文件内全局static变量 (和C一样)
作用域:本文件内
生命周期:程序退出
函数内static变量 (和C一样)
作用域:本函数内
生命周期:程序退出
面向对象
类中static成员变量
用法:使用时不用实例化,与类实例无关。(静态数据成员存储在全局数据区,静态数据成员定义时要分配空间,所以不能在类声明中定义。应该在类外定义。此外,在类体外定义时不能指定static关键字)。
初始化格式:<数据类型><类名>::<静态数据成员> = <值>
作用域:遵从类的public、private、protected访问规则
生命周期:程序退出
类中static成员方法
用法:可以引用static成员变量。无法访问属于类对象的非静态数据成员变量/函数。此外,类体外定义时不能指定static关键字
调用static成员方法方式: XClass::xxx_static_fun()、XClassInstant.xxx_static_fun()、XClassInstantP->xxx_static_fun()
作用域:遵从类的public、private、protected访问规则
生命周期:N/A
附1(可执行文件内存布局)
- .text 代码段存放可执行指令
- .data 初始化后数据 {
a. 只读数据区(const全局变量 字符串)
b. 已初始化可读数据区——全局区(全局变量)
c. 已初始化可读数据区——全局静态区(static全局变量) - .bss 未初始化数据(只记录数据需要多少空间,不为其真正分配内存)
a. 未初始化静态和全局变量 - .heap 运行时malloc动态分配的数据占用空间
a. 动态内存分配 - .stack 函数运行时分配的自动变量占用空间
a. 局部变量、函数参数 - 从可执行文件a.out的角度来讲,如果一个数据未被初始化那就不需要为其分配空间,所以.data和.bss一个重要的区别就是.bss并不占用可执行文件的大小,它只是记载需要多少空间来存储这些未初始化数据,而不分配实际的空间