• 如果有n个同类的对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各自有值,互不相干
    • 如想在同类的多个对象之间实现数据共享,可以用静态的数据成员.

    1.静态数据成员

    • 静态数据成员是一种特殊的数据成员。它以关键字static开头

      1. class Box
      2. {public:
      3. int volume( );
      4. private:
      5. static int height; //把height定义为静态的数据成员
      6. int width;
      7. int length;
      8. };
      • height为静态数据成员,为各对象所共有,而不只属于某个对象
      • 静态的数据成员在内存中只占一份空间
      • 每个对象都可以引用这个静态数据成员.
      • 静态数据成员的值对所有对象都是一样的。如值改变,则各对象中这个数据成员的值都同时改变


    • 说明:

      • 静态数据成员不属于某一个对象,在为对象所分配的空间中不包括静态数据成员所占的空间。
      • 静态数据成员是在所有对象之外单独开辟空间
      • 只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被引用。
      • 静态数据成员不随对象的建立而分配空间,也不随对象的撤销而释放.
      • 静态数据成员是在程序编译时被分配空间的,到程序结束时才释放空间。
      • 静态数据成员既可以通过对象名引用,也可以通过类名来引用。
      • 静态数据成员只能在类体外进行初始化

        1. int Box height=10;
        • 一般形式:数据类型 类名∷ 静态数据成员名=初值;
    • 不能用参数初始化表对静态数据成员初始化

      1. Box(int h,int w,int len):height(h){ } //错误,height是静态数据成员
    • 如果未对静态数据成员赋初值,则编译系统会自动赋予初值0

      1. //引用静态数据成员
      2. #include <iostream>
      3. using namespace std;
      4. class Box
      5. {public:
      6. Box(int,int);
      7. int volume( );
      8. static int height; //把height定义为公用的静态的数据成员
      9. int width;
      10. int length;
      11. };
      12. Box Box(int w,int len) //通过构造函数对width和length赋初值
      13. {width=w;
      14. length=len;
      15. }
      16. int Box volume( )
      17. {return(height*width*length);
      18. }
      19. int Box height=10; //对静态数据成员height初始化华南农业大学电子工程学院
      20. int main( )
      21. {
      22. Box a(15,20),b(20,30);
      23. cout<<a.height<<endl; //通过对象名a引用静态数据成员
      24. cout<<b.height<<endl; //通过对象名b引用静态数据成员
      25. cout<<Box height<<endl; //通过类名引用静态数据成员
      26. cout<<a.volume( )<<endl;
      27. }
    • 在类外可以通过对象名引用公用的静态数据成员,即使没有定义类对象,也可以通过类名引用静态数据成员

    • 如果静态数据成员被定义为私有的,则不能在类外直接引用,而必须通过公用的成员函数引用

    • 有了静态数据成员,各对象之间的数据有了沟通的渠道,实现数据共享,因此可以不使用全局变量

    • 注意公用静态数据成员与全局变量的不同,静态数据成员的作用域只限于定义该类的作用域内

    2.静态成员函数

    • 成员函数也可以定义为静态的

      1. static int volume( );
    • 和静态数据成员一样,静态成员函数是类的一部分,而不

    是对象的一部分

    • 如果要在类外调用公用的静态成员函数,要用类名和域运

    算符“∷ ”

    1. Box volume( );
    • 也允许通过对象名调用静态成员函数

      1. a.volume( );
    • 静态成员函数的作用是为了能处理静态数据成员

    • 静态成员函数不属于某一对象,因此静态成员函数没有this指针。既然它没有指向某一对象,就无法对一个对象中的非静态成员进行默认访问(即在引用数据成员时不指定对象名)。
    • 静态成员函数与非静态成员函数的根本区别是: 非静态成员函数有this指针,而静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。