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