我是 C++ 新手,我有一个问题......

我尝试通过制作测试应用程序来回答这个问题......在调试中,B类初始化生成较少的汇编代码,但在发布模式下,我真的不能说......它优化了初始化:(

假设我有两个课程:

class A
{
public:
    int a, b, c, d;

    A(int _a, int _b, int _c, int _d) : a(_a), b(_b), c(_c), d(_d)
    {
    }
};

class B
{
public:
    int a, b, c, d;
};

使用有什么好处吗

B b = {1, 2, 3, 4}

代替

A a = A(1, 2, 3, 4);

?

有帮助吗?

解决方案

我不知道的性能优势,但在一般使用构造是优选的。

这是因为与A,成员A,B,C,d可以由私人。因此,你得到的封装与你的一个办法,你不B的。

作为一个类的设计者,可以强制通过一个构造严格的使用和成员变量的分配。在你的B,类情况下,你不能。

因此,尽管你可能会在PERF的一个小提升,使用B,我敢打赌这是微不足道的,而且会通过无保护的类成员的潜在头痛被否定。

其他提示

有关一个全局对象和静态类成员,初始化列表不调用上运行时任何代码。 (初始化数据被直接存储在二进制)。

如果要初始化大量的对象,或如果构造代码是昂贵的/大,这可以使在加载时的显着差异。

如所述,这是真实的,只有用于普通老式的数据,即它可以与C ++ <0X

的初始化列表被初始化一切

您不必使用这种类型的初始化的C工作++编写明确的构造和C代码。

如果你有复杂的简单数据的Fileds的化合物结构,变量初始化可以比与构造更容易初始化列表:

B barr[5] = {
    {1,2,3,4},
    {5,6,7,8},
    ...
  };

这是(目前)只适用于简单的类,只有POD成员变量和程序员的缺点可能不是很熟悉的语法。

大多数类不能使用初始化列表(还),所以你最好使用构造函数只是要一致。 C ++ 0x中的std :: initializer_list将存在允许该语法的任何类。

以下是使用初始化列表的场景:

  1. 用于非静态 const 数据成员的初始化。
  2. 用于初始化参考成员。
  3. 用于初始化没有默认构造函数的成员对象。
  4. 用于基类成员的初始化。
  5. 当构造函数的参数名称与数据成员相同时。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top