c++ static 使用

概述

C++中的static关键词可以修饰变量(面向过程和面向对象的)和函数(同样也是有面向过程 和面向对象的),他可以改变变量和函数的作用域和生存周期。记起来可能会比较混乱, 其实只要理清楚几个方面就没有问题了。

  • 用在什么地方:面向过程和面向对象,两个有static变量和static函数。后者面向对象 是指使用在class中的static变量和static函数。
  • 在什么地方声明,定义和初始化。作用域和生存周期。

面向过程的static

面向过程的static变量

  • 局部static变量
    • 局部static变量在函数里面声明和定义,可以同时进行初始化,如果没有给初始值, 则被赋予默认的初始值。
    • 初始化之后变量保存在全局数据区,在程序退出之后才会被销毁。
    • 作用域在static变量定义的语句块中。比如在一个函数中定义的,那就只能在定义 之后和函数退出之前使用。
  • 全局static变量
    • 全局static变量定义之后即分配空间到全局数据区,同样在函数退出时才销毁。
    • 全局static变量作用域在文件内,如果在头文件中,那就在引用该头文件的地方也 有作用。
    • 和全局变量很像,而且很多时候也可以使用全局变量来替换,区别在于,全局 static变量在不同文件中,可以有同名的变量,但是全局变量则不行。

面向过程的static函数

  • 静态函数不能被其他文件引用,全局函数则可以。
  • 其他文件可以定义相同名字的函数,不会发生冲突。

面向对象的static(无私的static)

面向对象的static主要是在class中使用的。他们属于这个类及其所有实例化的对象,因 此可以通过类名或者实例名来访问他们,但是我们知道对于普通的变量和函数,在通过对 象访问他们的时候其实前面是隐藏了对象的指针this的, 而static的函数不具有this指 针,因此类的static函数也就不能访问类的非static函数和变量。

面向对象的static变量

  • static的变量一定要在类外显式地定义,并且也就是在定义的时候分配内存空间的。 如果不这样定义,编译的时候会提示undefined。

面向对象的static函数

  • 类的静态成员函数只能在类体内加上static限定,在类外,比如在类外实现的时候前 面不能加static。
  • 静态成员函数可以访问静态成员变量和静态成员函数,但是不能访问非静态成员变量 和非静态成员函数。
  • 静态成员变量和函数属于这个类和类的所有对象,因此,包括非静态函数也可以使用 静态成员函变量和函数。当然也要遵循public,protected,private等规则。
  • 调用静态成员变量和函数的时候可以使用ClassName::或者Instance.的形式访问。

Comments

comments powered by Disqus