c++静态成员

c++语言中,类可以当作模板,利用模板可以制造出许多具有相同属性的变量,即对象,在各个对象中,他们相互独立,每个对象的值都可以不同,但问题也随之而来,对于某一些数据,我们并不想它们在不同对象是不同的,举个栗子:现在某公司需要统计所有员工为此设计了一个员工类,里面包含一些员工的信息,如姓名,编号等。除此之外,类里还有一个员工总人数属性,这个属性的值无疑对每个这个类的实例来说都具有相同的值,这该如何设计呢?可能有些人会想,为每个对想赋予想同的值就行了呗!好吧,我原谅你的天真。c++的设计者们当然有着绝妙的想法(要不然咋当设计者,还是回家麦红薯去吧😀),c++为这种需要所有对象保持一致的值(也就是数据共享)提供了一种方法,就是将其申明为类变量(也叫类的静态变量),用关键词static修饰;话不多说,上代码:

  1. #include"pch.h"
    #include<iostream>
    
    using namespace std;
    
    class Empolyee { //员工类
    private:
        int salary;  //薪水
        string name;  //姓名
        static int count; //总人数
        int num;  //编号
    public:
        Empolyee(int salary, string name, int num) :salary(salary), name(name), num(num) {//构造函数
            count++; //总人数加一
        }
        ~Empolyee() {
            count--; //总人数减一
        }
        void showCount() {
            cout << "总人数有" << count << "" << endl;
        }
    };
    
    int Empolyee::count = 0;
    int main() {
        Empolyee e1(1000, "pony", 001);
        e1.showCount();
        Empolyee e2(2000, "liner", 001);
        e2.showCount();
        e2.~Empolyee();
        e1.showCount();
        return 0;
    }

运行结果如下:

 

 

这段代码声明了一个静态成员变量 count,用来统计员工的人数。

static 成员变量属于类,不属于某个具体的对象,即使创建多个对象,也只为 count 分配一份内存,所有对象使用的都是这份内存中的数据。当某个对象修改了 count,也会影响到其他对象。

static 成员变量必须在类声明的外部初始化,具体形式为:

type class::name = value;

type 是变量的类型,class 是类名,name 是变量名,value 是初始值。将上面的 count初始化:

int Student::count = 0;

静态成员变量在初始化时不能再加 static,但必须要有数据类型。被 private、protected、public 修饰的静态成员变量都可以用这种方式初始化。

 



注意:static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用。
static 成员变量不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问。具体来说,static 成员变量和普通的 static 变量类似,都在内存分区中的全局数据区分配内存。

说明 

1) 一个类中可以有一个或多个静态成员变量,所有的对象都共享这些静态成员变量,都可以引用它。

2) static 成员变量和普通 static 变量一样,都在内存分区中的全局数据区分配内存,到程序结束时才释放。这就意味着,static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。

3) 静态成员变量必须初始化,而且只能在类体外进行。例如:

int Empolyee::count = 10;

初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化为 0。全局数据区的变量都有默认的初始值 0,而动态数据区(堆区、栈区)变量的默认值是不确定的,一般认为是垃圾值。

4) 静态成员变量既可以通过对象名访问,也可以通过类名访问,但要遵循 private、protected 和 public 关键字的访问权限限制。当通过对象名访问时,对于不同的对象,访问的是同一份内存。

posted @ 2019-09-27 22:37  pony.ma  阅读(291)  评论(0编辑  收藏  举报