static变量初始化

1.在C++中,全局static变量和class的static成员变量在main函数之前初始化,main函数之后销毁

2. 函数内部的局部static变量在该函数第一次被调用时初始化,在main函数之后销毁

3.对于static数据即使是函数内部的对象则存放在全局数据区,全局数据区的数据并不会因为函数的退出就将空间释放。

#include <iostream>

using namespace std;

struct Date

{

	Data(){cout<<"create"<<endl;}

	~Data(){cout<<"destroy"<<endl;}

};

static Data g_sData;

int main()

{

	cout << "main start" << endl;

	cout << "main end" << endl;

	return 0;

}


output:

create
main begin
main end
destroy

#include <iostream>

using namespace std;

struct Date

{

Data(){cout<<"create"<<endl;}

~Data(){cout<<"destroy"<<endl;}

};

class Test

{

	static Data m_sData;

};

Data Test::m_sData;

int main()

{

cout << "main start" << endl;

cout << "main end" << endl;

return 0;

}

output:

create
main begin
main end
destroy


#include <iostream>

using namespace std;

struct Date

{

Data(){cout<<"create"<<endl;}

~Data(){cout<<"destroy"<<endl;}

};

void test()

{

	static Data sData;

}

int main()

{

cout << "main start" << endl;

cout << "first time call test" << endl;

test();

cout << "second time call test" << endl;

test();

cout << "main end" << endl;

return 0;

}



main begin
first
create
second
main end
destroy


在看一个比较BT的题目。

在系统中只能调用一次函数


void caller()
{
	cout<<"first call\n";
}

void FirstCall()
{
	static int d = (caller(),1);
}

int main()
{
	FirstCall();
	FirstCall();
}







### 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"; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值