C++ static关键字总结

引言
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。
静态变量, 不管你是否使用该函数,在程序初始化时就被分配的了,或者在第一次执行到它的声明的时候分配(不同的编译器可能不同),注意是声明的时候
如果使用的是const类型的static变量,那么就要在类中初始化:只有静态常量的整形数据成员才可以在类中初始化。
程序的内存分配
一、预备知识—程序的内存分配
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。 - 程序结束后由系统释放。
4、文字常量区 —常量字符串就是放在这里的(.rodata)。 程序结束后由系统释放。
5、程序代码区—存放函数体的二进制代码(.text)。

概述:静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

1.static关键字的作用
数据共享,减小内存;
可以保持封装特性;避免命名冲突的问题
2.static 关键字的生命周期
程序一开始运行时,变量就存在,变量存于内存的静态存储区;程序
运行结束时,由系统自动释放
3.static 关键字的初始化位置
在类的声明体之外进行初始化,初始化时,不需要有static关键字

1.非静态的全局变量在各个源文件中都是有效的;
静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它

  1. 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围
    3.static全局变量与普通的全局变量有什么区别:
    static全局变量只初使化一次,防止在其他文件单元中被引用;   
    static局部变量和普通局部变量有什么区别:
    static局部变量只被初始化一次,下一次依据上一次结果值;   
    static函数与普通函数有什么区别:
    static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

auto 与 static的区别:
auto的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放;而static就是不auto,变量在程序初始化时被分配,直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期;

静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。

static变量只有一次初始化,不管在类中还是在函数中
类的静态函数
实现的时候也不需要static的修饰,因为static是声明性关键字(同friend,声明时只需在友元的名称前加上关键字friend);类的静态函数是在该类的范畴内的全局函数,不能访问类的私有成员,只能访问类的静态成员,不需要类的实例即可调用;实际上,它就是增加了类的访问权限的全局函数

静态成员函数可以继承和覆盖,但无法是虚函数
常量静态成员必须在类中定义的,不可以const static在类外定义。

静态数据成员不能在类中初始化的原因:
静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在够造函数中初始化该成员,因为静态数据成员为类的各个对象共享,那么每次创建一个类的对象则静态数据成员都要被重新初始化
总结

C++ static关键字总结_第1张图片
image.png

参考链接:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html

http://www.cnblogs.com/youxin/archive/2012/05/17/2506757.html

http://blog.csdn.net/hankai1024/article/details/10336219

你可能感兴趣的:(C++ static关键字总结)