在构造函数上使用聚合初始化列表的优势?

时间:2009-05-23 18:03:04

标签: c++ constructor aggregate

我是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);

5 个答案:

答案 0 :(得分:4)

对于全局对象和静态类成员,初始化列表不会在运行时调用任何代码。 (初始化数据直接存储在二进制文件中)。

如果要初始化大量对象,或者构造函数代码很昂贵/大,这可能会在加载时产生显着差异。

如上所述,这仅适用于普通旧数据,即可以使用C ++中的初始化列表初始化的所有内容。 0X

答案 1 :(得分:2)

我不了解性能优势,但通常使用构造函数是首选。

这是因为对于A,成员a,b,c,d可以是私有的。因此,您可以使用A方法进行封装,这是B中没有的方法。

作为类设计器,您可以通过构造函数强制严格使用和分配成员变量。在你的B级课程中,你不能。

因此,虽然你可能会在使用B时获得一点点提升,但是我会谨慎地说它可以忽略不计,而且会因为没有保护的班级成员的潜在头痛而被否定。

答案 2 :(得分:1)

您不必在C ++中使用此类型的初始化显式编写构造函数和C代码。

如果你有复杂的简单数据文件复合结构,初始化列表比使用构造函数更容易初始化变量:

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

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

答案 3 :(得分:0)

大多数类都不能使用初始化列表(还有!),所以最好使用构造函数来保持一致。在c ++ 0x中,将存在std :: initializer_list以允许任何类的语法。

答案 4 :(得分:0)

以下是使用初始化列表时的方案:

  1. 用于初始化非静态const数据成员。
  2. 用于初始化参考成员。
  3. 用于初始化没有默认构造函数的成员对象。
  4. 用于初始化基类成员。
  5. 当构造函数的参数名称与数据成员相同时。