c++ - C++、结构和类构造函数中的 C 风格初始化列表

标签 c++ class list initialization

我仍在 C++ 的启蒙之路上,所以请耐心等待...

假设我有一个结构:

struct MyThing 
{
    int a, b;
};

我想用 c 风格的速记创建一个,图 1:

MyThing mt = { 1, 2 };

然后假设我决定在我的结构中的某个地方添加一个方法,并且(作为我这样的人)我觉得结构并不真正适合方法,所以把它变成一个类:

class MyThing 
{
public:
    int a, b;
    int sum() 
    {
        return a + b;
    }
};

我的 Fig.1 仍然工作正常 - 一切都很好。然后我决定我最终需要一个私有(private)方法和成员:

class MyThing 
{
private:
    int c;
    void swap() {
        c = a;
        a = b;
        b = c;
    }
public:
    int a, b;
    int sum() 
    {
        return a + b;
    }
};

此时,图 1 中的 c 样式初始化列表无法编译(无论如何在 VS 中),并显示“无法使用初始化列表初始化非聚合”——这里有很好的解释:http://msdn.microsoft.com/en-us/library/0s6730bb(v=vs.71).aspx

所以我切换到:

class MyThing 
{
private:
    void swap() {
        int c = a;
        a = b;
        b = c;
    }
public:
    int a, b;
    MyThing (int _a, int _b) : a(_a), b(_b) {}
    int sum() 
    {
        return a + b;
    }
};

然后把图1改成(图2)

MyThing mt(1, 2);

Sooooo,毕竟,我的问题是:使用 C 风格的初始化列表(即它们更快吗?)来创建东西有什么好处吗?还是它一开始就做得一样好:

struct MyThing
{
    int a, b;
    MyThing(int _a, int _b) : a(_a), b(_b) {}
};

并从一开始就将其用作图 2?是否有任何性能影响(即使可以忽略不计)?

谢谢!

最佳答案

好吧,首先,你说的例子失败了,但实际上确实有效。 (在添加构造函数之前它不会失败)

现在,请记住,对象只是一段内存。因此

的二进制图像
MyThing mt = { 1, 2 };        // Fig A

完全一样
int  mt[2] = { 1, 2};         // Fig B.

因此,要实现图 A 或图 B,编译器只需发出:

mt    DW      0x0001        Fig C
      DW      0x0002

换句话说,零运行时成本。

但是,如果存在构造函数,则它必须 运行(这是 C++ promise 的契约的一部分)。 (不可避免的运行时成本)

同样,私有(private)成员、基类等会干扰处理编译时分配所需的一对一对应关系,我们在图 C 中有。

关于c++ - C++、结构和类构造函数中的 C 风格初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7181210/

相关文章:

C++11 性能 : Lambda inlining vs Function template specialization

c++ - 存在引用和值重载时出现不明确的函数调用

C++ 有函数接受类型 int 和 int[] 使用模板

ruby - Rubocop 错误 'Class definition is too long ruby'

c++ - 内存释放卡住了我的程序

C++函数回调

c++ - 无法使用没有参数的模板化方法实例化模板化类

arrays - 使用 astropy 和 numpy 处理非常大的数组

python - 子列表每个位置的正则表达式模式的频率

c# - 为什么在构造时提供了足够大的列表插入失败?