如何为全局对象,对象数组以及类/结构体内的对象调用构造函数?

Jer*_*ten 12 c++ oop constructor

在这三种情况下,如何调用以下类的构造函数:全局对象,对象数组和另一个类/结构中包含的对象?

具有构造函数的类(在所有三个示例中使用):

class Foo {
    public:
        Foo(int a) { b = a; }

    private:
        int b;
};
Run Code Online (Sandbox Code Playgroud)

这是我尝试调用此构造函数:

全局对象

Foo global_foo(3); // works, but I can't control when the constructor is called.

int main() {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

对象数组

int main() {
    // Array on stack
    Foo array_of_foos[30](3); // doesn't work

    // Array on heap
    Foo *pointer_to_another_array = new Foo(3) [30]; // doesn't work
}
Run Code Online (Sandbox Code Playgroud)

在那里,我试图为数组的所有元素调用构造函数,但我也想知道如何在单个元素上调用它.

类/结构中包含的对象

class Bar {
    Foo foo(3); // doesn't work
};

int main() {
    Bar bar;
}
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 11

全局对象

你的是唯一的方法.另一方面,尽量避免这种情况.最好将函数(甚至其他对象)用作工厂.这样,您就可以控制创建时间.

对象数组

没有办法直接这样做.非POD对象将始终默认构造.std::fill往往是一个很大的帮助.您可能还想查看分配器和std::uninitialized_fill.

类/结构中包含的对象

在构造函数中使用初始化列表:

class Bar {
    Foo foo;

    Bar() : foo(3) { }
};
Run Code Online (Sandbox Code Playgroud)

实际上,静态成员必须在类外定义:

class Bar {
    static Foo foo;
};

Foo Bar::foo(3);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ork 5

纠正一些关于全局变量的误解:

  • 该顺序在编译单元内被明确定义。
    • 与定义顺序相同
  • 编译单元之间的顺序未定义。
  • 破坏的顺序与创造的顺序完全相反。

我不建议这样做,但是:因此一个简单的解决方案是将所有全局变量放入单个编译单元中。

或者,您可以调整函数静态变量的使用。
基本上你可以有一个函数返回对你想要的全局的引用(在函数内部定义全局)。它将在第一次使用时创建(并以与创建相反的顺序销毁)。

Foo& getGlobalA() // passed parameters can be passed to constructor
{
    static Foo  A;
    return A;
}
Foo& getGlobalB()
{
    static Foo  B;
    return B;
}
etc. 
Run Code Online (Sandbox Code Playgroud)