日更博主上线!本文继续总结C++语言中重要的关键字static,涉及部分面试题,一起来看看把!
const关键字指路C++学习——const关键字-CSDN博客
new、delete关键字C++学习——new delete关键字-CSDN博客
其它关键字C++学习——sizeof、ertern、volatile等其它关键字-CSDN博客
C语言中static用来修饰局部静态变量和全局静态变量、函数。
C++中除上述功能外,还用来定义类的成员变量和函数,即静态成员变量和静态成员函数。
static总是使得变量或对象的存储形式变成静态存储,连接方式变成内部连接。
作用:
(1)隐藏:当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。使用static在不同的文件中定义同名函数和同名变量不必担心命名冲突。
(2)记忆性。存储在静态数据区的变量会在程序刚开始运行时完成唯一一次初始化,静态的变量在函数被调用过程中维持其值不变。
(3)静态变量默认初始化为0。
1、函数体内
static修饰的局部变量作用范围为该函数体,不同于auto变量,其内存只被分配一次,其值在下次调用的时候维持上次的值。
2、模块内
static修饰全局变量或全局函数,可以被模块内的所有函数访问,但是不能被模块外的其他函数访问,使用范围限制在声明它的模块内。
3、文件内
static函数限定在本文件中使用,虽然其他文件可以知道它的存在,但不能使用;而普通函数默认是extern的,其他文件也可以使用。
4、类内
static修饰成员变量,表示该变量属于整个类所有,不属于对象,对类的所有对象只有一份拷贝,static修饰的变量先于对象存在,类内定义类外进行初始化。存放在全局(静态)存储区,不计入类的大小中。
static修饰成员函数,表示该函数属于整个类所有,在内存中只有一份拷贝,没有this指针,只能访问类的static成员变量。
static成员函数不能被声明为const。C++编译器在实现const的成员函数时为确保该函数不能修改类的实例状态,会在函数中添加一个隐式的参数const this*。但当成员函数为static时,是没有this指针的
static成员函数不能被virtual修饰。由于static成员函数不属于任何对象或实例,加上virtual没有任何实际意义,虚函数的实现是为每一个对象分配一个vptr指针,而vptr是通过this指针调用的,而static成员函数没有this指针,所以不能不能被virtual修饰。
虚函数的调用关系,this->vptr->vtable->virtual function
(1)static 成员变量是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突;
(2)可以实施封装。static 成员可以是私有成员,而全局对象不可以;
(3)static 成员是与特定类关联的,类内定义类外初始化
访问:
(1)<类对象名>.<静态数据成员名>
(2)<类类型名>::<静态数据成员名>
同:全局变量与静态全局变量是静态存储方式
异:
1、普通全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的。
2、静态全局变量则限制了其作用域只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它,可以避免在其他源文件中引起错误。
(1)静态变量仅初始化一次,但是可以多次赋值。
静态局部变量和全局变量一样,数据都存放在全局存储区域。在主程序之前,编译器已经为其分配好了内存。
(2)在C语言中,编译阶段分配好内存后就会进行初始化,因此在C语言中无法使用变量对静态局部变量进行初始化。
(3)C++标准定为全局或静态对象是有首次用到时才会进行初始化,这是由于C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,并非简单地分配内存,而需要进行特定操作。因此在C++中是可以使用变量对静态局部变量进行初始化的。
全局变量是整个程序都可以访问的变量,生存期是从整个程序开始运行到结束,程序结束时全局变量所占内存会被释放,分配在全局存储区
局部变量存在于模块,即子程序/函数中,只有所在模块可以访问,其它模块不能访问,模块结束后,局部变量所占用的内存被释放,分配在栈中
(1)局部会屏蔽全局。
局部变量与全局变量可以同名,在函数内引用该变量时,局部会屏蔽全局,使用同名的局部变量。要用全局变量,需要使用"::"。
(2)引用一个定义过的全局变量,可以采用引用头文件的方式,也可以用extern关键字。
引用头文件方式:某个在头文件中声明的全局变量,假定全局变量写错了,那么在编译期间会报错,
用extern方式引用:假定全局变量写错了,在编译期间不会报错,而在链接期间报错。
(3)可以在不同文件中以static 形式声明同名的全局变量,前提是其中只能有一个文件中对此变量赋初值。
好处:
(1)更加安全;
(2)更直接明显,可清楚地辨别代码中每个显式的强制类型转换,容易找出程序中的错误;
(3)可读性更好,能体现程序员的意图
有问题请及时指正~