static 关键字的总结
静态局部变量有以下特点:
1.该变量存放在静态存储区,直到程序运行结束才被销毁。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束
2.块作用域的静态变量,在首次进入到定义该静态变量的函数时,构造该变量,以后进入该函数时不再构造该变量了
3.静态局部变量一般在声明处初始化,如果没有显示初始化,程序会默认给它初始化为0.
静态全局变量有以下特点:
1.该变量存放在静态存储区,局部于源文件的变量,严格的讲作用域应该是定义之处开始到本文件结束
2.初始化:如果不显示初始化的话,那么程序默认给他初始化为0.
3.注意:文件作用域下声明的const常量默认为static。
静态函数有以下特点:
1.静态函数局部于源文件,它只能在本源文件中被使用(这是与普通的函数的区别)
2.注意;在文件作用域下声明的inline函数默认为static 类型.
静态数据成员有以下特点:
1.因为其静态数据成员空间在静态存储区分配,被所有本类的对象共享,所以,它属于类,而不属于特定的对象,
在没产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它。
因为程序一开始运行就必需存在,系统就分配好了内存,它不由构造函数来分配内存空间,所以它与对象无关,故可以节省内存,
提高效率
2.静态数据成员在类中只是声明,要在类外给予定义并初始化。程序不会默认给静态数据成员初始化的。
3.访问方式:
类类型名:静态数据成员名(建议采用这种方式)
类对象名.静态数据成员名
静态成员函数有以下特点:(静态成员函数的很多好处都是基于与类的实例无关,只与类有关,没有this指针)
1.静态成员函数的特性与静态数据成员类似,同样是与对象无关,只与类本身有关。
2.静态成员函数没有this指针,静态成员函数一般用于访问操作静态数据成员的。
3.静态成员函数可以在构造函数初始化期间使用,用于传递某些信息给非静态成员,进而初始化
4.静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就产生了一个意想不到
的好处:成为一个callback函数,使得我们得以将C++和C-based X Window系统结合,同时也成功的应用于线程函数身上,
可以把某些系统API的回调函数以静态函数的形式封装到类的内部。
5.访问方式:
类类型名:静态数据成员函数名(建议采用这种方式)
类对象名.静态数据成员函数名
6.单例模式策略:
1.将构造函数声明为private,禁止用户自己构造对象。定义一个静态成员函数,在函数内部定义一个静态对象,返回该对象的引用或指针。
2.要保证不能复制和赋值操作,将这两个函数的声明声明为private就够了。
7.总之,从OOA/OOD的角度考虑,一切不需要实例化就可以有确定行为方式的函数都应该设计成静态的。
以上只是一些基本的考虑,并不是绝对的。绝对东西的只有一点:“静态函数不需要实例化就可以被调用,不会也不可以调用或操纵非静态成员”。
记住这一点,那么实际编程中何时需要用,何时适合用,自然就更容易作出决定了。
非静态成员函数可以访问静态成员函数。原因是:非静态成员函数带有this指针,他可以访问任意的成员
静态成员函数不可以访问非静态成员函数。原因是:静态成员函数没有this指针
在基类中定义了静态数据成员的话,则基类的所有对象和派生类的所有对象共享该数据成员。
派生类对象不想与基类对象共享基类的静态成员的话,则派生类需要屏蔽基类的静态成员。
方法是:在派生类中重定义该成员,实现派生类对象不与基类对象共享基类的静态数据成员 ,因为我们的编译器采用了一种绝妙的手法:name-mangling
用以生成唯一的标志。但如果屏蔽共享功能时,又需要用基类的静态成员数据的话,则用作用域域运算符来访问基类的该成员
补充:软件开发 , C++ ,