C++中的静态成员变量

本文深入探讨了C++中静态成员变量的概念、特性和使用方法。解释了静态成员变量如何被类的所有对象共享,其生命期独立于任何对象,以及如何在类内外进行正确的初始化。同时,详细说明了const静态成员变量的初始化规则。

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

1.1 C++中静态成员变量的使用方法

在C++中可以定义静态成员变量:

  • 静态成员变量属于整个类所有。
  • 静态成员变量的生命期不依赖于任何对象。
  • 可以通过类名直接访问公有静态成员变量。
  • 所有对象共享类的静态成员变量。
  • 可以通过对象名访问公有静态成员变量。

静态成员变量的特性:

  • 在定义时直接通过static关键字修饰。
  • 静态成员变量需要在类外单独分配空间。
  • 静态成员变量在程序内部位于全局数据区。

语法规则:

  • Type ClassName::VarName = value;

静态成员变量定义方式如下:

// test.h
class Test
{
private:
	static int m_a;
};

// test.cpp
int m_a = 0;	// 这里可以赋值也可以不赋值

对于非const的类静态成员,只能在类的实现文件中初始化,并且只要在声明处加上static,实现处不需要加static。

对于const类静态成员,可以在类内设置初始值,也可以在类的实现文件中设置初始值(但是不能同时在这两个地方初始化,只能初始化1次,否则编译出错)。需要注意的是,实现和声明处都必须加上const。

// test.h
class Test
{
private:
	const static int m_a = 0;
};

// test.cpp
cosnt int Test::m_a;

参考资料:

  1. C/C++从入门到精通-高级程序员之路【奇牛学院】
  2. C++深度解析教程
### C++静态成员变量的概念 在 C++ 中,静态成员变量属于整个类而非某个特定对象实例。这意味着无论创建多少个该类的对象,静态成员变量都只有一份副本存在于内存中,并且可以被所有对象共享访问。 ### 静态成员变量的声明与定义 静态成员变量需先在类体内声明,在类体外单独定义并初始化: ```cpp class MyClass { public: static int count; // 只是声明 }; int MyClass::count = 0; // 定义和初始化[^1] ``` 注意这里 `MyClass::count` 的定义是在全局作用域下完成的,而不是放在任何函数内部。 ### 初始化方式 对于不同类型的成员变量而言,其初始化的方式也有所不同。具体到静态成员变量上,有如下特点: - **不能直接在类内初始化**(除了静态常量整型数据成员),而应该在类外部进行初始化; - 如果是非const类型的静态成员,则既可以在构造函数内的初始化列表中指定初始值也可以通过其他途径设置默认值;但是更常见的是直接在外面给定一个具体的数值作为起始状态。 - 对于`static const` 成员如果编译期已知的话可以直接在类里面给出初值[^2]。 例如下面的例子展示了如何处理不同类型的数据成员: ```cpp #include <iostream> using namespace std; class Example { private: double normalMember; const char* constPtrToConstChar="hello"; static int s_var; static constexpr int s_constexpr_var=98765;// 编译时常量 public: Example():normalMember(3.14),s_var(1){} // 构造器初始化列表尝试对静态成员赋值会报错,此处仅为示范正常成员初始化 }; // 正确做法是在文件范围内定义并初始化静态成员变量 int Example::s_var = 12345; int main(){ cout << "Static variable initialized to:"<<Example::s_var<<endl; } ``` 上述代码片段中,`s_var` 是静态成员变量,它应当在类之外的地方定义并且赋予初始值。而对于 `constexpr` 类型的静态成员则允许在类定义时即刻给予固定不变的具体取值[^3]。 ### 访问权限及注意事项 尽管静态成员不属于任何一个具体对象,但仍遵循相应的存取控制符 (`public`, `protected`, 或者 `private`) 来决定谁能对其进行操作。另外需要注意的一点就是当涉及到多线程环境下的并发读写时要特别小心同步问题以免引发竞争条件等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值