我的意思是:我有一堆不同的结构/类,所有这些都应该用已知的预先值初始化。除了预初始化之外,这些结构/类永远不会以其他方式使用,因此不需要构造函数 - 它只是浪费额外的内存,程序中额外的CPU周期以及源代码中的额外空间。
答案 0 :(得分:6)
如果您可以访问C ++ 11编译器,则可以将构造函数标记为constexpr
,以使它们在编译时运行。这样做的好处是,您可以在运行时构建对象。 e.g。
struct Point2D {
constexpr Point2D(int x, int y) : x_{x}, y_{y} {}
int x_, y_;
};
现在你可以使用Point2D的构造函数在编译时初始化它,而不是运行时:
Point2D p{3, 4}; // no runtime overhead.
答案 1 :(得分:5)
在有限的情况下,可以初始化结构和类。
struct splendor {
int i, j;
char *name;
};
splendor iforus = { 1, 2, "Extra!" };
此外,如果您从不需要结构类型的名称:
struct {
int k;
float q;
} anon_e_mouse = { 1, 2.3 };
答案 2 :(得分:2)
您可以在声明点初始化成员:
struct Foo
{
int i = 42;
double x = 3.1416;
std::string name = "John Doe";
};
这将为所有实例设置默认值:
Foo f;
std::cout << f.i << std::endl; // prints 42
请注意,这不适用于C ++ 03,它需要C ++ 11支持。
答案 3 :(得分:1)
如果类(或结构)没有构造函数,则可以像这样初始化它:
MyClass a = MyClass();
或
MyClass * b = new MyClass();
这称为值初始化,它通常等于零初始化。
答案 4 :(得分:1)
C ++ 11为您提供了initializer_list。
#include <iostream>
struct s
{
int i;
};
int main() {
s s1={666};
s s2={42};
std::cout<<s1.i<<" "<<s2.i<<std::endl;
return 0;
}
您还可以为成员进行类内初始化。
#include <iostream>
struct s
{
int i=0;
};
int main() {
s s1; //s1.i = 0
//s s2={42}; //fails
std::cout<<s1.i<<" "<<std::endl;
return 0;
}
但你不能同时做机器人。
答案 5 :(得分:1)
听起来你正在尝试实现Singleton模式。当你这样做时,你仍然需要一个构造函数(事实上,如果你想强迫它成为一个单例,你有将默认构造函数声明为private
)。
class MySingleton
{
private:
// my data
MySingleton() { /* initialize my data */ }
public:
static MySingleton& GetInstance()
{
static MySingleton instance;
return instance;
}
// other functions
};