开发者

static variable construction in C++

开发者 https://www.devze.com 2022-12-20 15:36 出处:网络
How do compilers know how to correctly handle this code? struct Foo { int bar; Foo() { bar = 3; } Foo& operator=(const Foo& other)

How do compilers know how to correctly handle this code?

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);

What wou开发者_如何转开发ld the final value of someOtherBaz.bar be?


The value of someOtherBaz.bar would be 3.

Static objects within a translation unit are constructed in the order they appear within the TU (note, there is no defined order of static object in different translation units).

  1. First, baz will be constructed with the default constructor. This will set baz.bar to 3.
  2. Next someOtherBaz will be constructed via the copy constructor. Since no copy constructor was defined, a default copy constructor will be used which will just copy each field. So someOtherBaz.bar will be given the value of 3.
  3. Finally, to construct placeholder, baz.SetBar will be called which will also change the value of baz (but not someOtherBaz since they are independent objects; while you created someOtherBaz based on the value of baz, they are different objects so can change independently).

So, at the end, you'll have:

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

精彩评论

暂无评论...
验证码 换一张
取 消