优秀电商网站设计,网站建设维护 知乎,网站在建设中模板,全国室内设计学校1. static关键字
不考虑类的情况
隐藏-所有不加static的全局变量和函数具有全局可见性#xff0c;可以在其他文件中使用#xff0c;加了之后只能在该文件所在的编译模块中使用#xff0c;即内部连接默认初始化为0#xff0c;包括未初始化的全局静态变量与局部静态变量可以在其他文件中使用加了之后只能在该文件所在的编译模块中使用即内部连接默认初始化为0包括未初始化的全局静态变量与局部静态变量都存在全局未初始化区静态变量在函数内定义始终存在且只进行一次初始化具有记忆性其作用范围与局部变量相同函数退出后仍然存在但不能使用。
考虑类的情况
static成员变量只与类关联不与类的对象关联。定义时要分配空间不能在类声明中初始化必须在类定义体外部初始化初始化时不需要标示为static可以被非static成员函数任意访问。
static成员函数不具有this指针无法访问类对象的非static成员变量(可以通过对象访问)和非static成员函数不能被声明为const、虚函数和volatile可以被非static成员函数任意访问。
面试过程中如果你能够答出上面的知识点那么恭喜你基本掌握static的特点但过于表面。面试官可能会继续追问你
你说static静态局部变量只会初始化一次那么具体是怎么实现的呢 简单来说就是static修饰的局部静态变量附近**存放着1字节的标识位(最多可以标识8个静态变量)用来标识该变量是否初始化**。此外**编译器还会在标识位附近加锁用来保证局部静态变量的初始化线程安全**。static成员变量为什么不能在类的声明中初始化必须要在类定义体外初始化 静态成员变量属于类而不属于对象因此静态成员变量只有一份副本不像非静态成员变量那样每个对象都拥有自己的一份。**如果在类声明中初始化那么可能就会出现重复初始化导致链接的时候报错**所以在类外初始化主要是为了保证只初始化一次。按照上一个问题你说静态成员变量在类定义体外显式地初始化是为了保证只初始化一次那为什么不能像静态局部变量采用标识位来保证只初始化一次呢 可以从生命周期上来切入**首先静态局部变量的生命周期是从第一次执行到定义静态局部变量的语句时到程序结束**所以可以设置标识位来避免重复定义。**而静态成员对象的生命周期和类声明周期一样程序开始到程序结束在编译期间就已经为静态成员变量分配内存了所以没办法进行判断**。换句话说静态局部变量可以理解为运行时当然可以校验标识位**但是静态成员变量是编译时逻辑已经固定不存在动态来判断标识位。**static成员函数为什么不能被声明为constvirtual和volatile constconst 成员函数是用来保证对象的常量性不变即在该函数中不会修改对象的成员变量。**但是 static 成员函数并不依赖于特定的对象它只是属于类本身因此没有必要将其声明为 const**。virtualvirtual 是用来实现多态的关键字它只适用于非静态成员函数。**static 成员函数不依赖于任何对象也就无法实现多态特性因此不能被声明为virtual。** volatilevolatile 关键字用于指示编译器在优化代码时不应该对变量进行缓存或优化。**但是 static 成员函数并不访问任何对象的状态也不受任何对象状态的影响因此没有必要使用 volatile 修饰符。**顺便扩展下为什么函数在类定义体里面定义不会出现重复定义的问题 首先在类定义体里面定义函数**默认都是内联的内联函数就是在调用该函数出进行插入代码段所以不会出现重复定义的问题**。