关于C++中的静态成员变量

本文详细解释了C++中静态成员变量的初始化过程,包括如何确保每次调用getInstance()函数时都能得到正确的实例,并避免多次初始化的问题。通过实例演示了如何在类的外部进行静态成员变量的初始化。

这个东西每次都搞错:

////.h文件

class Node
{
public:
	static Node* m_instance;
	static Node * getInstance()
};
//.cpp

Node * Node::m_instance = NULL;

Node * getInstance()

{

if(Node::m_instance == NULL)

{

Node::m_instance = new Node()

}

return Node:m_instance;

}


//很简单,但是一直都没记住,哎。。。。。

### 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、付费专栏及课程。

余额充值