C-static-静态成员变量

43次阅读

共计 1167 个字符,预计需要花费 3 分钟才能阅读完成。

总述

  • static 成员变量属于类,不属于某个具体的对象
  • static 成员变量必须在类声明的外部初始化。
  • static 成员变量是在初始化时分配内存的,程序结束时释放内存。
项目 内容
关键词 static
访问控制
初始化 类外初始化
分配内存时机 初始化时
释放内存时机 程序结束时
内存分配位置 全局数据区

—–

一般概念

静态成员变量是一种特殊的成员变量,它被关键字 static 修饰。

class Student {
public:
    string getName() { return name;}

    static int total;// 静态成员变量
private:
    string name;
};

这个 student 类声明了一个 public 的静态成员变量 total,用来表明学生的总数,这个变量为这个类所共有,无论创建多少个学生对象,total 变量在内存中都只有一个。

static 成员变量属于类,不属于某个具体的对象。 和普通的成员变量一样,static 成员变量也有 private、protected、public 的访问控制。

初始化

static 成员变量必须在类声明的外部初始化(除了一个例外,之后会说到),以刚刚的类为例,其初始化具体形式为:

int Student::total=0;
类型 类名:: 变量名 = 值;(注意不必再加 static)
  • 初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化为 0。全局数据区的变量都有默认的初始值 0,而动态数据区(堆区、栈区)变量的默认值是不确定的,一般认为是垃圾值。
  • 被 private、protected、public 修饰的静态成员变量都可以用这种方式初始化。

需要注意的是,static 成员变量是在初始化时分配内存的。 不是在类声明时,也不是在创建对象时。因此,没有初始化的 static 成员变量无法使用,因为还没分配内存。

访问方法

  • static 成员变量不占用对象的内存,所以只要经过类外初始化,即使不创建对象也可以访问
  • 可以通过对象名访问,也可以通过类名访问,但要遵循 private、protected 和 public 关键字的访问权限限制。
// 通过类类访问 static 成员变量
Student::total = 10;
// 通过对象来访问 static 成员变量
Student stu;
stu.total = 20;
// 通过对象指针来访问 static 成员变量
Student *p_stu = new Student();
p_stu -> total = 20;

可以类内初始化的一个例外

类型 static const int 可以类内初始化,如下。

class Student {
public:
    string getName() { return name;}

    static const int total=1;// 类内初始化
private:
    string name;
};

但在类内初始化了就不要在类外再进行一次,否则是重复定义。

正文完
 0