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)
纠正一些关于全局变量的误解:
我不建议这样做,但是:因此一个简单的解决方案是将所有全局变量放入单个编译单元中。
或者,您可以调整函数静态变量的使用。
基本上你可以有一个函数返回对你想要的全局的引用(在函数内部定义全局)。它将在第一次使用时创建(并以与创建相反的顺序销毁)。
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)