You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何静态局部实例的构造函数不会被第二次调用?

函数内静态局部变量的初始化规则解析

先看你提供的代码:

#include <iostream>

class my_class {
    public:
    static my_class& factory(int val) {
        static my_class instance{val};
        return instance;
    }
    private:
    my_class(int value) {
        std::cout<<value<<std::endl;
    };
};


int main() {
    auto& i77 = my_class::factory(77); // 调用#1
    auto& i1 = my_class::factory(1);  // 调用#2
    return 0;
}

调用#2时发生了什么?

第一次调用factory(77)时,程序执行到static my_class instance{val};这一行:

  • 静态局部变量instance会被分配到程序的静态存储区,同时用传入的77作为参数调用构造函数,输出77。
  • 一旦这个静态变量完成初始化,后续任何时候再执行到这条定义语句时,都会直接跳过初始化步骤——不会再次调用构造函数,直接返回已经存在的instance对象的引用。

所以第二次调用factory(1)时,虽然传入的val是1,但程序不会构造新的instance,直接把第一次创建的对象引用返回给i1,自然不会触发构造函数的输出。

该行为是否符合C++标准?

完全符合。C标准明确规定:函数内部的静态局部变量,只会在程序第一次执行到该变量的定义语句时完成初始化,后续执行到该语句时不会重复初始化。这个规则从C98标准开始就存在,C++11之后还额外保证了这种初始化是线程安全的(多个线程首次同时访问时,只会有一个线程完成初始化,其他线程等待)。

内容的提问来源于stack exchange,提问作者Xeenych Xeenych

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:45:54