代码之家  ›  专栏  ›  技术社区  ›  Kevin Doyon Zephaniah Grunschlag

使用聚合初始化列表优于构造函数?

  •  1
  • Kevin Doyon Zephaniah Grunschlag  · 技术社区  · 15 年前

    我是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 回复  |  直到 8 年前
        1
  •  2
  •   Alan    15 年前

    我不知道性能优势,但一般来说,最好使用构造函数。

    这是因为有了A,成员A,B,C,D可以成为私有的。因此,您可以使用A方法获得封装,而B中没有这种方法。

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

    因此,虽然你可能会得到一个小的提高,为使用B,我打赌它是微不足道的,并将被潜在的头痛有无保护的班级成员否定。

        2
  •  4
  •   Benoît photo_tom    15 年前

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

    如果您正在初始化许多对象,或者如果构造函数代码很昂贵/很大,那么在加载时这会有显著的不同。

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

        3
  •  1
  •   sth    15 年前

    您不必显式地使用C++中的这种初始化工作来编写构造函数和C代码。

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

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

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

        4
  •  0
  •   rlbond    15 年前

    大多数类还不能使用初始化列表!,所以最好使用构造函数来保持一致。在C++0xSTD::IndialIZELSILL列表中,允许任何类的语法。

        5
  •  0
  •   Rohit Gurjar    8 年前

    以下是使用初始值设定项列表时的场景:

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