代码之家  ›  专栏  ›  技术社区  ›  Clark Gaebel

C++中的静态变量构造

c++
  •  3
  • Clark Gaebel  · 技术社区  · 16 年前

    编译器如何知道如何正确处理此代码?

    struct Foo
    {
        int bar;
    
        Foo()
        {
            bar = 3;
        }
    
        Foo& operator=(const Foo& other)
        {
            bar = other.bar;
            return *this;
        }
    
        int SetBar(int newBar)
        {
            return bar = newBar;
        }
    };
    
    static Foo baz;
    static Foo someOtherBaz = baz;
    static int placeholder = baz.SetBar(4);
    

    最后的价值是什么 someOtherBaz.bar 是吗?

    1 回复  |  直到 16 年前
        1
  •  10
  •   R Samuel Klatchko    16 年前

    价值 someOtherBaz.bar 将是3。

    翻译单元中的静态对象按照它们在tu中出现的顺序构造(注意,不同翻译单元中没有定义的静态对象顺序)。

    1. 第一, baz 将使用默认构造函数构造。这将设置 baz.bar 到3。
    2. 下一个 someOtherBaz 将通过复制构造函数构造。由于没有定义复制构造函数,因此将使用默认的复制构造函数,它只复制每个字段。所以 其他酒吧 将得到3的值。
    3. 最后,构造 placeholder ,请 baz.SetBar 也会改变 巴兹 (但不是) 某某巴兹 因为它们是独立的对象;当您创建 某某巴兹 基于 巴兹 ,它们是不同的对象,因此可以独立更改)。

    最后,你会得到:

     baz.bar: 4
     someOtherBaz.bar: 3
     placeholder: 4