static
Q1:为什么使用static?
A1:一方面,对函数内部定义的变量,在程序执行到它的定义时,编译器会在栈上为他分配内存空间,等该函数执行完后,会将栈上的空间释放掉。那么,如果我想把这次函数的值保存到下一次使用呢?一种做法是将变量设置为全局变量,但是这样做的会改变变量的访问范围,也就说不仅仅在函数内该变量会改变,在其他范围内都可以对该变量进行改变,存在问题。另一种做法就是对该变量进行static关键字的设置,可以很好的解决这一问题。另一方面,对于有特定要求的类,需要有某个数据对象为这个类服务而非某个对象,同时要求该数据对象隐藏在类的内部,对外不可见,static可以很好的解决这一问题。
Q2:static的作用有什么?
A2:1、static修饰的静态局部变量,只初始化一次,延长了局部变量的生命周期,当程序运行结束时才释放掉;
2、static修饰全局变量,这个全局变量只能在本文件中访问,不能在其他文件访问,即使extern关键字修饰也不可以,数据安全性;
3、static修饰一个函数,则这个函数只能在本文件中访问,不能在其他文件中访问。
4、不想被其他释放的时候,使用static。
Q3:静态变量的特点?
A3:1、静态变量都时在全局数据区分配内存;
2、未显式初始化的静态变量会被初始化为0。(函数体内的变量会随机初始化赋值,除非已经式赋值。而在函数体外的变量也会被初始化为0)
Q4:静态全局变量的特点?
A4:静态全局变量在声明它的文件内是可见的,在其他文件是不可见的。值得一提的是,其他文件可以定义该静态全局变量相同的名字,不会发生冲突。
Q5:全局变量和静态全局变量的区别?
A5:全局变量具有外部连接性,作用域是整个工作域。在一个文件中定义了某个全局变量,可以通过extern声明在另一个文件中使用;
静态全局变量的作用域是声明该变量static的文件,其他文件即使使用extern也不能使用。
Q6:静态局部变量的特点?
A6:静态局部变量在编译器执行到该声明时首次初始化,以后的函数调用不再进行初始化。它始终留在全局数据区中,随着程序的结束而释放。其作用域是函数体或语句块,当执行结束时,其作用域随之结束。
Q7:静态方法能不能引用非静态资源?
A7:不能,实例化才能产生的资源,对于初始化就产生的静态资源,根本不识别。
Q8:静态方法能不能引用静态资源?
A8:可以,同时初始化,认识。
Q9:非静态方法能不能引用静态资源?
A9:可以,静态资源先于非静态方法初始化。
总结:
1、静态成员函数,不能调用非静态成员变量;
2、非静态成员函数可以调用静态成员变量;
3、静态成员变量在使用前必须初始化(int Glucose::type_size = 0),否则会发生linker错误;
静态数据成员:
1、静态数据成员可以实现多个对象共享使用,它在内存中只占一个空间,在各个对象中,静态数据成员一处变,处处变;
2、静态数据成员在程序开始运行期间就被分配空间,到程序结束才释放掉。只要类中定义了静态数据成员,那么即使不定义对象,也会分配内存空间;
3、静态数据成员初始化在类的外部,如果未显式初值,则编译器为其赋0;
4、静态数据成员可以通过对象名引用,也可以通过类名引用。
静态成员函数:
1、静态成员函数主要用来访问静态数据成员,而不是非静态数据成员;
2、非静态成员函数有this指针,静态成员函数没有this指针。
浙公网安备 33010602011771号