2

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

4

6 回答 6

6

如果您可以访问 C++11 编译器,则可以将构造函数标记为constexpr让它们在编译时运行。这样做的好处是,您仍然可以在运行时构造对象。例如

struct Point2D {
    constexpr Point2D(int x, int y) : x_{x}, y_{y} {}
    int x_, y_;
};

现在您可以使用 Point2D 的构造函数在编译时初始化它,而不是运行时:

Point2D p{3, 4}; // no runtime overhead.
于 2013-10-18T14:15:49.583 回答
5

在有限的情况下,可以初始化结构和类。

struct splendor {
    int i, j;
    char *name;
};

splendor iforus = { 1, 2, "Extra!" };

此外,如果您从不需要结构类型的名称:

struct {
    int k;
    float q;
} anon_e_mouse = { 1, 2.3 };
于 2013-10-18T14:15:21.480 回答
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 支持。

于 2013-10-18T14:17:06.557 回答
1

如果一个类(或结构)没有构造函数,你可以像这样初始化它:

MyClass a = MyClass();

或者

MyClass * b = new MyClass();

这称为值初始化,通常相当于零初始化

于 2013-10-18T14:21:50.790 回答
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;
}

但是你不能同时做机器人。

于 2013-10-18T14:22:52.183 回答
1

听起来您正在尝试实现单例模式。当你这样做的时候,你仍然需要一个构造函数(实际上,如果你想强制它成为一个单例,你必须将默认构造函数声明为private)。

class MySingleton
{
private:
    // my data

    MySingleton() { /* initialize my data */ }
public:
    static MySingleton& GetInstance()
    {
        static MySingleton instance;
        return instance;
    }

    // other functions
};
于 2013-10-18T14:23:10.513 回答