第25课 类的静态成员变量

0.C语言的static关键字

https://www.cnblogs.com/hoiday/protected/p/9998577.html

(1)static关键字指明变量“静态”属性——static修饰的局部变量全局变量存储在程序静态区静态变量,只能被初始化一次

(2)static关键字同时具有作用域限定符

  static修饰的全局变量作用域只是声明的文件中

  static修饰的函数作用域只是声明的文件中

 

1. 成员变量的回顾

(1)通过对象名能够访问public成员变量

(2)每个对象成员变量都是专属的

(3)成员变量不能在对象之间共享

 

2、新的需求

  • 统计在程序运行期间某个类的对象数目

  • 保证程序的安全性不能使用全局变量

  • 随时可以获取当前对象的数目

 

【编程实验】解决方案的尝试  25-1.cpp

#include <stdio.h>

class Test
{
private:
    int mCount;
public:
    Test() : mCount(0)
    {
        mCount++;
    }
    ~Test()
    {
        --mCount;
    }
    int getCount()
    {
        return mCount;
    }
};

Test gTest;

int main()
{
    Test t1;
    Test t2;
    
    printf("count = %d\n", gTest.getCount());
    printf("count = %d\n", t1.getCount());
    printf("count = %d\n", t2.getCount());
    
    return 0;
}

运行结果:

  

 

3. 静态成员变量

(1)C++中的静态成员变量

  ①静态成员变量属于整个类所有

  ②静态成员变量生命期不依赖于任何对象

  ③可以通过对象名,也可以通过类名直接访问公有静态成员变量

  ④所有对象共享类的静态成员变量

 

(2)静态成员变量的特性

  ①在定义时直接通过static关键字修饰

  ②静态成员变量在程序内部位于全局数据区,所以需要类外为其单独分配空间

  (因为new或栈中的对象只会为非静态成员分配空间,而不会为静态成员分配,所以必须在类外单独为其分配空间

  ③为静态成员变量分配空间语法规则

    Type ClassName::VarName = value;     //要像定义全局变量一样放在函数外

 

【编程实验】静态成员变量的使用   25-2.cpp

#include <stdio.h>

                      

class Test

{

private:

    static int cCount;

 

public:

    Test(){cCount++;}

 

    ~Test(){--cCount;}

 

    int getCount(){return cCount;}

};

 

//使用前必须在类外给静态成员变量分配空间

int Test::cCount = 0; //表明要在全局区,而且只能在全局区分配空间,并初始化为0

 

Test gTest; //cCount增加1

 

int main()
{

    //int Test::cCount = 0;错误,试图在这里为静态成员分配空间

   

    Test t1; //cCount增加1

    Test t2; //cCount增加1

 

    printf("sizeof(Test) = %d, sizeof(t1) = %d\n",

                sizeof(Test), sizeof(t1));        //等于1,表示cCount是在全局区分配空间,

                                                  //该变量不属于某个对象本身的。

 

    printf("count = %d\n", gTest.getCount());//3,通过对象名访问static成员变量

    printf("count = %d\n", t1.getCount());

    printf("count = %d\n", t2.getCount());

 

    Test* pt = new Test(); //cCount增加1

 

    printf("count = %d\n", pt->getCount()); //4

 

    delete pt;   //cCount减1

 

    printf("count = %d\n", pt->getCount()); //3

 

    //printf("count = %d\n", Test::cCount);//错误,通过类名只能访问公有的static成员变量

 

    return 0;

}

运行结果:

  

 

 

4. 小结

(1)中可以通过static关键字定义静态成员变量

(2)静态成员变量隶属于类所有

(3)每一个对象可以访问静态成员变量(可以通过类名和对象访问

(4)静态成员变量全局数据区分配空间

(5)静态成员变量的生命期为程序运行期

posted @ 2018-12-09 17:20  梦心之魂  阅读(160)  评论(0编辑  收藏  举报