C++ static 静态成员变量在初始化时分配内存,程序结束时释放内存

本文深入解析C++中static成员变量的特点与使用方法,包括其初始化、内存分配及访问控制等关键概念,帮助读者全面理解static成员变量的运行机制。

总述

  • 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;
};

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

### C++static 成员变量初始化方法 在 C++ 中,`static` 成员变量属于类的所有实例共享,因此它的生命周期与类的实例无关。为了正确初始化 `static` 成员变量,必须遵循特定规则。以下详细说明了初始化方法及其注意事项。 #### 1. 类外部初始化 静态成员变量不能直接在类定义中初始化,而需要在类外部进行初始化。这是因为在类定义中,静态成员变量仅被声明,而初始化涉及存储分配,这通常在编译无法决定[^2]。例如: ```cpp class MyClass { public: static int myStaticVar; // 声明静态成员变量 }; // 在类外部初始化静态成员变量 int MyClass::myStaticVar = 42; ``` #### 2. 初始化静态成员变量初始化发生在程序启动,即在 `main` 函数执行之前完成。这种初始化方式确保了静态成员变量程序运行期间始终可用,并且其值对所有类实例一致[^5]。 #### 3. 线程安全性 如果静态成员变量初始化发生在运行(而非编译或加载),可能会引发线程安全问题。这是因为多个线程可能同尝试访问或修改该静态变量。然而,C++11 标准引入了“静态局部变量”的线程安全初始化机制,从而解决了这一问题。 #### 4. 示例代码 以下是一个完整的示例,展示如何定义和初始化静态成员变量: ```cpp #include <iostream> class Student { public: static int number; // 声明静态成员变量 Student() { number++; // 每创建一个实例,number 自增 } static void printNumber() { std::cout << "Total students: " << number << std::endl; } }; // 在类外部定义并初始化静态成员变量 int Student::number = 0; int main() { Student s1, s2, s3; Student::printNumber(); // 输出 Total students: 3 return 0; } ``` #### 5. 注意事项 - 静态成员变量初始化只能在类外部进行,不能在构造函数初始化列表中完成[^1]。 - 如果静态成员变量是 `const` 类型,则可以在类内直接初始化,但前提是其类型为内置类型或具有常量表达式语义[^3]。 - 使用 C++11 或更高版本,可以利用新特性简化某些初始化场景,但仍需注意兼容性问题[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值