5. 静态成员变量

静态成员变量 是类本身的变量,他属于类,不属于类的创建的对象。

静态成员变量与普通变量的区别:

  1. 普通成员变量:该类创建的对象各自用于一份副本,没有对象都有自己的同名成员变量。
  2. 静态成员变量:全局只有一个副本,该类创建的对象都共用这个变量。

静态成员变量 需要在类内声明,在类外单独定义,因此要使用静态成员变量需要在类的声明部分进行声明,同时在类外实现部分的代码处进行定义和初始化。

静态成员变量声明的语法:

class 类名{
    访问说明符:
        static 变量类型 变量名;
};

静态成员变量定义的语法:

静态成员变量 只有在定义时才会单独为其分配内存,并赋予初始值(如果有初始值)。

变量类型 类名::变量名[ = 初始值];

静态成员变量的使用方法

类名::变量名
// 或
对象名.变量名

示例

记录一个类创建对象的个数;

// filename: static_member_var
#include <iostream>
#include <string>

using namespace std;

class Person {
    public:
        static int total_count; // 声明静态成员变量
        Person(const string & n, int a): name(n), age(a)  {
            cout << "创建:Person(" << n << ", " << a << ");\n";
            // 成员函数内使用静态成员变量
            total_count++;
        }
        ~Person(void) {
            cout << "析构:~Person(" << name << ", " << age << ");\n";
            total_count--;
        }
    private:
        string name; // 姓名
        int age; // 年龄
};

// 定义静态成员变量
int Person::total_count = 0;

int main(int argc, char * argv[]) {
    Person p1("老魏", 35); 
    Person p2("魏明择", 35); 
    // 两种使用静态成员变量的方法 
    cout << "Person对象的个数:" << Person::total_count << endl;
    cout << "Person对象的个数:" << p2.total_count << endl;

    return 0;
}

编译和运行结果如下:

weimz@mzstudio:~$ g++ -o static_member_var static_member_var.cpp
weimz@mzstudio:~$ ./static_member_var 
创建:Person(老魏, 35);
创建:Person(魏明择, 35);
Person对象的个数:2
Person对象的个数:2
析构:~Person(魏明择, 35);
析构:~Person(老魏, 35);

从上述运行结果可知,静态成员变量全局只有一个,每个对象的成员函数(包括构造函数和析构函数)都可以修改和访问这个成员变量。如果该成员变量是公有访问权限,则其他函数也可以访问这个静态成员变量。

静态成员变量通常用于记录类全局的信息,而不是对象的信息。