一、修饰成员变量
1、c++中,静态变量采用的是静态存储方式。不过,使用静态存储方式的不一定就是静态变量。例如:全局变量。全局变量虽然不是静态变量,但是存储方式是静态的。
2、静态变量包括:静态局部变量和静态全局变量。全局变量再加以static修饰,就变成了静态全局变量。由于全局变量本来就是静态存储方式,再冠以static,当然还是静态存储方式。
3、静态全局变量和不同的全局变量再存储方式上是没有区别的,二者的区别仅在于:
a、普通的全局变量的作用域是整个源程序,即当一个源程序有多个源文件组成时,普通的全局变量再各个文件内都是有效的。
b、静态全局变量则限制了其作用域,即该变量只能在其所定义的源文件内有效,而在同一源程序的其他原文件中不能使用。
4、类的static数据成员是属于类的,而不是具体的某个对象。它不因对象的创建而产生,也不因对象的撤销而消失。
5、static成员变量属于类,所以需要对它进行初始化,且不能在类内初始化。(其实一直在纠结到底是“必须初始化”呢,还是“需要初始化”,如果非要钻语法的牛角尖,还是写成“需要初始化”吧!)
注意:
class Myclass
{
private:
static int s_num; // 没初始化???? 其实并不是
};
void main()
{
system("pause");
}
上面的程序运行时正确的,并不是该结论是错误的,而是,那条语句并不是定义语句,只是一条声明语句,所以当然不会报错。
这段代码其实没任何意义,也只能出现在讨论static的用法的语境中。
6、static数据成员属于类,对它的初始化不能在构造函数中进行。因为创建一个对象就会调用类的构造函数,而变量的初始化应该只被设定一次。
7、static成员变量是需要初始化的,且初始化只能在类外,
初始化格式为:
<类型> <类名>::成员变量名=value; //不需要再加static修饰
static Myclass::temp=10;
不过存在一个特殊情况,const,static 同时修饰的成员变量必须在类内初始化。
二、修饰成员函数
1、静态成员函数:使用static修饰的成员函数。
2、静态成员函数是不能声明为虚函数的。因为静态成员函数也是属于类的,而不是具体的某个对象。定义了静态成员函数,只要类存在,那么静态成员函数就存在,不因对象的存在有无而变化。由于静态成员函数属于类,而不属于对象,所以不存在this指针。
3、对静态成员函数的访问不需要通过对象,当然使用对象也能访问。
Myclass m1;
a、使用对象访问:m1.静态虚函数名(参数列表);
b、使用类名访问:Myclass::静态函数名(参数列表);
4、静态成员函数只能访问类内的静态数据成员、静态成员函数和类外的函数或数据,不能访问类内的非静态成员。相反的,非静态的成员函数是可以访问静态成员变量和静态成员函数的。