C/C++中的变量和静态变量
static有两种用法:一是面向过程程序设计语言中的static,用于普通变量和函数,不涉及类;二是面向对象程序设计中的static,主要涉及static在类中的作用。
面向过程设计中的static
- 非static全局变量
非static全局变量保存在内存中程序的数据段,生存期为程序的整个生存期,有效范围为整个程序,只需要在一个源文件中被定义,就可以作用于所有源文件 - 非static局部变量
非static局部变量保存在内存中数据的栈内存区域,生存期为该局部变量定义的函数的调用期间,有效范围为定义该局部变量的函数内部。当该函数调用结束后,变量被撤销,其所占用的内存被收回 - static全局变量
static全局变量保存在内存中程序的数据段,生存期为从该变量第一次被定义到程序结束,有效范围为全局,但如果程序含有多个文件,则只能在被定义的文件中被访问,在其他文件模块中不能被访问 - static局部变量
static局部变量保存在内存中程序的数据段,生存期为从该变量第一次被定义到程序结束,有效范围为该变量被定义的函数内部。
静态变量会被放在程序的静态数据存储区(数据段)(全局可见)中,这样可以在下一次调用的时候还可以保持原来的值,这是与堆变量和栈变量的区别;变量用static告知编译器,自己仅仅在变量定义的作用范围内可见,这是与全局变量的区别
(1)若全局变量仅仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
(2)若全局变量仅仅被单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
(3)设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时候,要考虑重入问题,因为他们都在静态数据存储区,全局可见;
(4)如果我们需要一个可重入的函数,则一定要避免函数中使用static变量;
(5)函数中必须使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
面向对象设计中的static
- 非静态成员变量
非静态成员变量在类的每个对象中都存在有一个副本,各个对象中的相应副本相互独立。 非静态成员变量和对象挂钩,生存期间为其所在对象的生存期间。 - 非静态成员函数
非静态成员函数的第一个隐含参数为调用该函数的对象的this指针。 非静态成员函数可以访问类的非静态成员变量,也可以访问类的静态成员变量和调用类的静态成员函数。 - 静态成员变量
静态成员变量为该类的所有对象共享的变量,所有的对象都只访问这一个变量实例。静态成员变量可以通过类名::变量名 或者 实例名.变量名来访问 - 静态成员函数
静态成员函数没有隐含的this指针参数,且只能访问类的静态成员变量和全局的变量,可以作为回调函数来使用。