关于static 与 const
static声明的变量或函数仅在本文件有效。强调的是存储的位置:全局区(静态区),当static修饰成员函数时,该函数只能访问静态数据成员;其修饰的函数或变量在其作用域外并不释放,而是在程序结束才释放。另外,普通对象除了调用普通成员函数外还可以调用静态成员函数。
const声明的变量或函数意为“只读”,强调的是常量不变。当const修饰成员函数时,该函数除了可以访问const类型的数据变量外,也可访问普通成员变量;其修饰对象时,该对象只能调用const成员函数,不能调用其它非const成员函数。
另外,成员函数是一份,即不同对象的成员函数是同一函数代码段;而,数据成员(非静态)则是随对象的个数而拷贝的,多份。。。
静态数据成员在内存中只占一份空间,每个对象都可以引用这个静态数据成员。静态数据成员的值对所有对象都是一样的。如果改变它的值,则在各对象中这个数据成员的值都同时改变了。这样可以节约空间,提高效率。
说明:
1.如果只声明了类而未定义对象,则类的一般数据成员是不占内存空间的,只有在定义对象时,才为对象的数据成员分配空间。但是静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间。静态数据成员是在所有对象之外单独开辟空间。只要类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被引用。
2.如果在一个函数中定义了静态变量,在函数结束时该静态变量并不释放,仍然存在并保留其值。静态数据成员也是如此,它不随对象的建立而分配空间,也不随对象的撤销而释放。静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间。
3.静态数据成员可以初始化,但只能在类体外进行初始化。声明时候加static,初始化时不要加static。注意:不能用参数初始化表对静态数据成员初始化。如果未对静态数据成员赋初值,则编译系统会自动赋予初值0.
4.静态数据成员既可以通过对象名引用,也可以通过类名来引用。如果静态数据成员被定义为私有的,则不能在类外直接引用,而必须通过公用的成员函数引用。
5.有了静态数据成员,各对象之间的数据有了沟通的渠道,实现数据共享,因此可以不使用全局变量。全局变量破坏了封装的原则,不符合面向对象的要求。------------引自《C++程序设计》