函数内Static初始化的用法

本文通过一个C++示例程序演示了不同作用域下静态对象与局部对象的构造及析构顺序,并展示了如何通过将对象声明为static来控制初始化和清理过程。

如果想第一次使用的时候再初始化,而程序正常退出的时候,再释放资源。那么应该将其放到某个函数中,作为static声明。

#include "Object.h"
#include "Container.h"
#include <iostream>

using namespace std;

static Object sglobal(" static global");
Object global(" global");

void func()
{
 cout << "  In func()" << endl;
 Container cc;
 cout << "  Out func()" << endl;
}

void func2()
{
 cout << "  In func2()" << endl;
 Container cc;
 cout << "  Out func2()" << endl;
}

int main()
{
 cout << "main() begin." << endl;
 Object local(" local");
 func();
 func2();
 //Container cc;
 cout << "main() end." << endl;
 return 0;
}

输出是:

 

C:/Project/CPP/LearnCpp/debug>InitializationOrder.exe
 static global initializing...
 global initializing...
 object in container initializing...
 global in container initializing...
 static global in container initializing...
main() begin.
 local initializing...
  In func()
 Static In Container Constructor initializing...
 In Container Constructor initializing...
Initializing Container ...
 In Container Constructor releasing...
  Out func()
Releasing Container ...
  In func2()
 In Container Constructor initializing...
Initializing Container ...
 In Container Constructor releasing...
  Out func2()
Releasing Container ...
main() end.
 local releasing...
 Static In Container Constructor releasing...
 static global in container releasing...
 global in container releasing...
 object in container releasing...
 global releasing...
 static global releasing...
### 使用 `static` 函数初始化数组的方法及注意事项 #### 方法概述 在 C/C++ 中,可以利用 `static` 关键字修饰函数内的局部变量或数组。当 `static` 被用于修饰数组时,该数组会在整个程序生命周期内保留其值[^1]。这意味着即使函数执行完毕返回后,下一次再进入此函数时,数组仍然保存着上一次的状态。 如果需要通过 `static` 来实现数组的初始化,则可以通过以下方式进行: ```cpp #include <iostream> using namespace std; void test() { static int array[5]; // 声明一个静态数组 bool first_time = true; if(first_time){ for(int i=0;i<5;i++) { array[i]=i*2; } first_time=false; } cout << "Array elements are:" << endl; for(int j=0;j<5;j++) { cout << array[j] << ' '; } } int main(){ test(); // 输出第一次计算的结果 test(); // 再次调用仍输出相同结果,因为array是静态的并保持上次状态 } ``` 上述代码展示了如何在一个函数内部定义一个 `static` 的整型数组,并仅在其首次访问时对其进行初始化[^4]。注意这里引入了一个布尔类型的标志位 `first_time` ,以确保只进行一次初始化操作。 #### 注意事项 - **初始化时机**:对于 `static` 局部变量或者数组来说,默认情况下它们只会被初始化一次,即在程序启动阶段完成零初始化(数值类型设为 0 或者字符串类型填充 '\0')。因此,在实际应用中通常还需要额外逻辑判断是否已经完成了自定义初始赋值过程。 - **作用域限制**:尽管 `static` 变量在整个应用程序运行过程中都存在,但是它的可见性和普通局部变量一样受到所在块级结构的影响。也就是说其他地方无法直接引用这个由 `static` 定义于某个特定方法里的对象实例[^2]。 - **多线程环境下的考虑**:由于 `static` 存储类别意味着共享资源特性,在并发编程场景里可能引发竞争条件等问题。所以在设计此类功能的时候要特别小心处理同步机制等方面的内容[^5]。 #### 总结 综上所述,虽然可以在 C/C++ 的函数体内借助 `static` 实现持久化的数组存储效果,但在具体实施前应充分考虑到以上提到的各种因素以便做出合理的选择和安排。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值