在没有构造函数的情况下,C ++中是否有一种预初始化结构或类的方法?

时间:2013-10-18 14:13:02

标签: c++ class constructor struct

我的意思是:我有一堆不同的结构/类,所有这些都应该用已知的预先值初始化。除了预初始化之外,这些结构/类永远不会以其他方式使用,因此不需要构造函数 - 它只是浪费额外的内存,程序中额外的CPU周期以及源代码中的额外空间。

6 个答案:

答案 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
};