1.static修饰的变量是可以被修改的,static const修饰的变量是不可以被修改的。
把第15行注释掉后运行结果为:
2.之所以叫做静态,是因为不受函数调用和退出而发生变化,不会因为退出函数而消亡,而是一直保持最新被更新的值。存储在静态数据区,该区域在程序运行期间一直不释放。
3.static变量被声明在函数体内则为局部静态变量,只能在定义该函数内部使用。
4.加上static关键字的全局变量就是只能本文件调用,所以extern不能和static一起使用,而没加关键字的static的全局变量可以使用extern调用。使用extern取其他文件全局变量时,不需要在当前头文件中添加其他文件的头文件。
5.static代码块可以优化程序性能,会在类加载的时候,按照static块顺序执行一次。
6.在当前文件内,但在函数体外的静态全局变量,可以被本文件所引用,不可被外部文件引用。
7.静态函数只是在声明他的文件当中可见,不能被其他文件所用。函数的实现使用static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突。
8.静态成员变量可以作为成员函数的参数,而普通成员变量不可以。
9.静态数据成员的类型可以是所属类的类型,而普通数据成员的类型只能是该类类型的指针或引用。
10.静态成员变量必须类内声明,类外赋值初始化。
11.静态成员变量可以作为成员函数的参数,而普通成员变量不可以。
12.静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值>
13.类的静态数据成员有两种访问方式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
14.同全局变量相比,使用静态数据成员有两个优势:
- 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性
- 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能
15.静态成员函数
- 静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数
- 出现在类体外的函数定义不能指定关键字static
- 非静态成员函数可以任意地访问静态成员函数和静态数据成员
- 不能将静态成员函数定义成虚函数:静态成员函数属于类,而虚函数必须根据对象类型才能知道调用哪一个虚函数,故虚函数是一定要在对象的基础上才可以。
- 不可以同时用const和static修饰成员函数:C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。