使用参数

时间:2015-12-13 22:05:47

标签: c++ c++11 static local

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

  

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

我很惊讶地发现下面的代码编译得很好而且有合理的输出:

#include <iostream>
using namespace std;

void test(int x){

    static int y = x;
    cout << y;

}

int main(){

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

}

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

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

static

1 个答案:

答案 0 :(得分:8)

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

  

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

因此,当您第一次调用y时,您的变量test会初始化。