很多时候,我们在定义构造函数时,有人会选择将成员初始化放在函数里,有人会放在成员初始化列表中,这两种有什么区别呢,先运行以下代码:
class test
{
friend test foo(double);
public:
test()
{
memset(array, 0, 100 * sizeof(double));
}
inline test(const test &t)
{
memcpy(this, &t, sizeof(t));
}
private:
double array[100];
};
class Point
{
public:
Point(test x, test y, test z)
:_x(x), _y(y), _z(z)
{
}
private:
test _x, _y, _z;
};
int main()
{
double dur;
clock_t start, end;
start = clock();
for (unsigned int i = 0; i < 100000; i++)
{
test a, b, c;
Point p(a, b, c);
}
end = clock();
dur = double(end - start);
printf("Use time: %f\n", (dur/CLOCKS_PER_SEC));
system("pause");
return 0;
}
以上运行时间如下:
那如果我把它改成放在函数里定义呢?
Point(test x, test y, test z)
//:_x(x), _y(y), _z(z)
{
_x = x;
_y = y;
_z = z;
}
它的时间如下:
总体上,时间少了一些,也就是成员初始化列表对于在函数初始化,少了一步临时对象生成之类的,当然对于这种基础类型可能不是很明显,对于复杂的对象,可能就比较明显。
所以我一般建议将成员初始化放在列表中。