我有一个数学矢量类,其设计如下:
class Vector3D {
public:
float x;
float y;
float z;
public:
Vector3D() {}
Vector3D(float xx, float yy, float zz = 0.0) { x=xx; y=yy; z=zz; }
Vector3D(const float v[]) { x=v[0]; y=v[1]; z=v[2]; }
Vector3D(const Vector3D& v) { x=v.x; y=v.y; z=v.z; }
// math member methods
// ...
};
我曾经使用以下方法在堆栈上创建一个Vector3D类型的变量:
Vector3D vec1 = Vector3D(1.0, 1.0, 1.0);
我听说可以通过实现初始化列表构造函数来缩短C ++ 0x,因此可以编写如下内容:
Vector3D vec1 = { 1.0, 1.0, 1.0 };
实施此方法的正确方法是什么?
花括号语法真正开箱即用!感谢您的回答和评论!
另外,我做了一些综合性能测试,试图测量构造函数初始化列表是否在构造函数中提供了成员变量赋值的加速。以下是我用g ++ 4.6.1得到的结果:
原样(构造函数和自定义复制构造函数中的成员赋值):
Median: 634860 ns
Median, CPI: 15.8715 ns
Average: 636614 ns
Average, CPI: 15.9154 ns
使用构造函数初始化列表&自定义复制构造函数:
Median: 634928 ns
Median, CPI: 15.8732 ns
Average: 636312 ns
Average, CPI: 15.9078 ns
使用构造函数初始化列表&默认复制构造函数:
Median: 860337 ns
Median, CPI: 21.5084 ns
Average: 864391 ns
Average, CPI: 21.6098 ns
一些结论:
答案 0 :(得分:6)
Brace初始化适用于所有类型的构造函数,在这种情况下您不需要初始化列表构造函数参数。相反,初始化列表用于变量内容,如动态容器的内容,但不适用于固定长度的构造函数参数。所以你可以说:
vector3D v { 1, 1, 1 };
一切都会好的。
但请注意,您应该真正初始化您的班级成员,而不是分配它们:
Vector3D(float xx, float yy, float zz = 0.0) : x(xx), y(yy), z(zz) { }
Vector3D(const float v[]) : x(v[0]), y(v[1]), z(v[2]) { }
你也不应该写一个复制构造函数,因为它没有比默认提供的复制构造函数更好。赋值运算符也是如此。
(就个人而言,我对float[]
构造函数感到不舒服;最好使用std::array<float, 3>
;但是你可能会再次使用这样的数组作为你的3D矢量从一开始就打字,根本不打算写一个自定义类。)
最后,您可以在构建向量列表的最后一个示例中组合construct-initializer-lists和initializer-list-constructors:
std::list<Vector3D> l { { 1.0, 2.0, 3.0}, { 1.5, 3.0, 4.4 }, { 0.0, -1.2, 4.1 } };