c++ 类中static变量初始化问题

本文详细解析了C++中static变量的初始化与使用方式,包括函数内的static局部变量及类中的static成员变量,并对比了const与非const类型的static变量的区别。

 首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数:

这里的static int a=3只执行了一次。在main中调用Foo()两次,结果为34.将上面的函数改为

同样在Foo()中调用两次.结果为33

在类中使用非const的static类成员变量。初始化时要使用typename classname::variablename = value的形式

例如:

如果使用的是const类型的static变量,那么就要在类中初始化:

如果是模板中使用非const的static的变量..那需要根据具体类型初始化。

例如 int myClass<int>::a = 4;那么如果你调用的是cout << myClass<double>::a,那一定会编译出错的。

因为模板是不是具体类型,myClass<int>, myClass<double>才是一个具体类型,而一个类静态成员在特定类中被初始化一次。这样就好理解了。

### C++的 `static` 变量初始化方法 在 C++ 中,`static` 成员变量属于整个而非某个具体对象。因此,在定义中仅能声明这些静态成员变量,而它们的实际初始化必须在外完成。 #### 静态成员变量初始化规则 1. **外单独初始化** 在定义之外对 `static` 成员变量进行显式的初始化操作是必要的[^2]。这是因为静态成员变量的生命周期独立于任何实例化对象,其存储空间由编译器统一管理并分配。 ```cpp class MyClass { public: static double myStaticVar; }; // 初始化 double MyClass::myStaticVar = 3.14; ``` 2. **整型常量特殊情况 (C++98)** 如果静态成员是一个整数型的常量,则可以在内部直接赋初值[^3]。然而需要注意的是,这种方式适用于早期标准(如 C++98),而在现代 C++ 版本中已有所扩展支持更多数据型。 ```cpp class AnotherClass { public: static const int MAX_SIZE = 100; // 整型常量可以直接在初始化 }; ``` 3. **C++11 新特性:内初始值设定** 自从引入 C++11 后,允许通过特定语法形式为非整型静态成员提供默认值作为占位符,尽管最终仍需在外部分配实际内存位置[^4]。 ```cpp class ModernClass { public: static double piValue = 3.14159; // 使用 C++11 的新功能设置初步数值 }; // 即使有了上面的定义,仍然要执行下面这一步骤来正式确立该变量的存在域及其地址关联关系 double ModernClass::piValue; ``` 4. **指针或复杂结构体/容器型的处理** 对于指向其他资源或者更复杂的集合型来说,往往采取先将其置零再按需动态创建策略[^3]。 ```cpp class ComplexExample { public: static ComplexExample* pInstance; static std::map<std::string, std::string> dataStore; private: ComplexExample() {} }; // 显式指定初始状态为空 ComplexExample* ComplexExample::pInstance = nullptr; std::map<std::string, std::string> ComplexExample::dataStore; ``` 以上便是关于如何正确地针对不同种的数据实施相应的初始化措施总结说明。 ```cpp // 综合示例展示多种情况下的实现手法 #include <iostream> #include <map> class Example { public: static const int SIMPLE_CONSTANT; // 声明只读简单整数 static double FLOATING_POINT_NUMBER; // 浮点数例子 static Example* SINGLETON_INSTANCE; // 单件模式中的全局唯一实体代表 static std::map<int, std::string> LOOKUP_TABLE;// 键值映射表样例 private: Example(){} }; const int Example::SIMPLE_CONSTANT = 42; // 定义并赋予固定不变的值 double Example::FLOATING_POINT_NUMBER = 2.718; // 提供近似自然底数e的一个估值 Example* Example::SINGLETON_INSTANCE = new Example();// 实际生成单子模型的对象句柄 std::map<int,std::string> Example::LOOKUP_TABLE={{1,"One"},{2,"Two"}};// 初始化一些预设条目 int main(){ std::cout << "Constant Value: " << Example::SIMPLE_CONSTANT << "\n"; std::cout << "Floating Point Number: " << Example::FLOATING_POINT_NUMBER << "\n"; delete Example::SINGLETON_INSTANCE; // 清理之前建立起来的那个独一无二个体 Example::SINGLETON_INSTANCE=nullptr; // 将引用重置回安全未绑定状况 auto it=Example::LOOKUP_TABLE.find(2); if(it!=Example::LOOKUP_TABLE.end()) std::cout<<"Lookup Result:"<<it->second<<"\n"; } ```
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值