用static修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,用static修饰的变量在静态存储区生成的,所以用static修饰一方面的好处是可以节省对象的内存空间。
类中的static数据成员需要在类之外进行初始化。
由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数不能访问非static的类成员,不能调用非静态的成员函数,只能访问 static修饰的类成员,可以直接通过类名调用。
在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。可作为对象间的一种通信机制。
静态局部变量有以下特点:
●该变量在全局数据区分配内存;
●静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
●静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
●它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束(但其本身还留存在全局数据区,只是函数结束,没有能操作它的对象了);
静态函数
在函数返回类型前加static,函数就定义为静态函数。函数的定义和声明在默认情况下都是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。函数的实现使用static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突;
注意:不要在头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则cpp内部声明需加上static修饰。