我还在路上在C++中以启迪,让我承担......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仍然正常工作 - 一切都是hunky dory。然后,我决定,我会最终需要的私有方法和成员:
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?是否有任何性能影响(即使它可忽略不计)?
谢谢!
“是它们更快“ - 我会推荐使用任何最自然的方式,只有在真正遇到瓶颈时才更快地担心。如果你在一个紧密的循环中执行此操作,那么可能会有其他问题... – Flexo
答案是“否”,它们没有比正确的初始化列表更快。 –
@Minging Duck--这就是我刚刚得出的结论 - 虽然使用简写来创建事物可以节省打字时间,但是当它们嵌套时(即嵌套的POD结构),读取速度相当可怕 - 而且具有构造函数只有额外的输入是类名(使用()而不是{}) - 更清晰,因为发生了什么:) 现在我同意awoodland - 如果它成为一个问题,担心性能;这不太可能,如果我担心表现,我会创建许多不同的实例... 谢谢你的回答:) – Seb