1

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

?

4

5 回答 5

4

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

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

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

于 2009-05-23T18:36:06.073 回答
2

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

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

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

因此,虽然您可能会因为使用 B 而在性能上得到小幅提升,但我敢打赌它可以忽略不计,并且会因拥有不受保护的班级成员的潜在头痛而被否定。

于 2009-05-23T18:09:38.973 回答
1

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

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

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

它(当前)仅适用于仅具有 POD 成员变量的简单类并且程序员可能不太熟悉语法的缺点。

于 2009-05-23T18:18:35.400 回答
0

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

于 2009-05-23T18:13:03.960 回答
0

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

  1. 用于初始化非静态 const 数据成员。
  2. 用于引用成员的初始化。
  3. 用于初始化没有默认构造函数的成员对象。
  4. 用于基类成员的初始化。
  5. 当构造函数的参数名称与数据成员相同时。
于 2016-09-28T12:34:09.053 回答