静态数据成员
- 静态数据成员属于类( 准确地说,是属于类中一个对象集合 ) , 而不像普通数据成员那样属于某一对象,因此可以使用“类名∷”访问静态的数据成员。例如上面例子中的 Student∷count。
- 静态数据成员不能在类中进行初始化, 因为在类中不给它分配内存空间, 必须在 类外的其它地方为它提供定义。一般在 main()开始之前, 类的声明之后的特殊地带为它 提供定义和初始化。缺省时,静态成员被初始化为零。
- 静态数据成员与静态变量一样, 是在编译时创建并初始化。它在该类的任何对象被建立之前就存在,它可以在程序内部不依赖于任何对象被访问。
- C + + 支持静态数据成员的一个主要原因是可以不必使用全局变量。依赖于全局变量的类几乎都是违反面向对象程序设计的封装原理的。静态数据成员的主要用途是 定义类的各个对象所公用的数据,如统计总数、平均数等。
静态成员函数
在类定义中,前面有 static 说明的成员函数称为静态成员函数。静态成员函数属于整个类,是该类所有对象共享的成员函数, 而不属于类中的某个对象。
静态成员函数首先是一个成员函数,因此它不能像类以外的其它函数那样使用, 在使用时要用“类名∷”作为它的限定词,或指出它作用在哪个对象上。其次静态成员函数是一种特殊的成员函数,它不属于某一个特定的对象, 要让一个静态成员函数去访问一个类中的非静态成员,既麻烦又没有实际意义。一般而言, 静态成员函数访问的基本上是静态数据成员或全局变量。
- 静态成员函数可以定义成内嵌的, 也可以在类外定义, 在类外定义时, 不要用 static 前缀。
- 编译系统将静态成员函数限定为内部连接, 也就是说,与现行文件相连接的其它文件中的同名函数不会与该函数发生冲突,维护了该函数使用的安全性, 这是使用静态成 员函数的一个原因。
- 使用静态成员函数的另一个原因是, 可以用它在建立任何对象之前处理静态数 据成员,这是普通成员函数不能实现的功能。
- 在一般的成员函数中都隐含有一个 this 指针, 用来指向对象自身,而在静态成员 函数中是没有 this指针的,因为它不与特定的对象相联系, 调用时使用如下格式较好
类名∷静态成员函数名()
small - cat∷total - disp( ) ;
当然把它看作是某个对象的成员也是允许的,如使用以下语句也是正确的:
w1 .total - disp( ) ;
- 一般而言, 静态成员函数不访问类中的非静态成员。若确实需要,静态成员函数只能通过对象名(或指向对象的指针) 访问该对象的非静态成员。如把 display( ) 函数定义为静态成员函数时,应将对象作为参数, 可将它定义为:
static void display (small-cat & w)
{ cout<< ”The small - cat weights”<< w .weight<< ”pounds \ n”; }