当前位置:  开发笔记 > 编程语言 > 正文

使用参数初始化本地静态

如何解决《使用参数初始化本地静态》经验,为你挑选了1个好方法。

鉴于C++ Primer对本地静态对象的描述:

拥有一个本地变量可能很有用,该变量的生命周期会持续调用该函数.我们通过将局部变量定义为静态来获取此类对象.在第一次执行通过对象的定义之前,将初始化每个本地静态对象.当函数结束时,不会破坏局部静态; 它们在程序终止时被销毁.

我惊讶地发现以下代码编译良好,具有合理的输出:

#include 
using namespace std;

void test(int x){

    static int y = x;
    cout << y;

}

int main(){

    test(2);
    test(5);
    test(6);

}

通过这样的描述,似乎使用函数参数进行初始化是不可能的或没有多大意义,它如何y在执行通过函数之前初始化,它将如何知道它是什么x?这是C++ Primer的过度简化,还是我的程序可能出现编译器无法检测到的错误?

对于那些想知道为什么我可能尝试使用参数初始化静态变量的人,我试图创建一个函数,用于default_random_engine在每次调用时返回所提供范围内的随机整数(因此需要static因此对象不是销毁)作为C++ Primer的另一个练习的一部分:

unsigned randomUns(unsigned minV, unsigned maxV, default_random_engine::result_type seed = 0){

    static default_random_engine e(seed);
    static uniform_int_distribution u(minV, maxV);

    return u(e);
}

Kerrek SB.. 8

您之前选择的"之前"一词很难选择.C++标准描述了具有静态存储持续时间的块范围变量的初始化,如[stmt.dcl]/4:

第一次控制通过其声明时,执行具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的块范围变量的动态初始化; 这样的变量在初始化完成后被认为是初始化的.如果通过抛出异常退出初始化,则初始化未完成,因此下次控制进入声明时将再次尝试初始化.如果控制在初始化变量时同时进入声明,则并发执行应等待初始化完成.

因此,您的变量y在您第一次调用时初始化test.



1> Kerrek SB..:

您之前选择的"之前"一词很难选择.C++标准描述了具有静态存储持续时间的块范围变量的初始化,如[stmt.dcl]/4:

第一次控制通过其声明时,执行具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的块范围变量的动态初始化; 这样的变量在初始化完成后被认为是初始化的.如果通过抛出异常退出初始化,则初始化未完成,因此下次控制进入声明时将再次尝试初始化.如果控制在初始化变量时同时进入声明,则并发执行应等待初始化完成.

因此,您的变量y在您第一次调用时初始化test.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有