成员初始化列表和构造函数体都是针对类的构造函数的,它们的作用是在对象被创建时对类的成员进行初始化。
- 成员初始化列表
在C++11标准之前,对于类成员变量的初始化是在构造函数体中进行的,而在C++11标准之后,可以使用成员初始化列表来对成员变量进行初始化。成员初始化列表是指在构造函数的参数列表后面加上冒号“:”,接着是一系列的成员变量初始化语句。
示例1:
class Person {
public:
Person(string name, int age): _name(name), _age(age) {}
private:
string _name;
int _age;
};
在这个例子中,我们通过成员初始化列表的方式来对Person类的两个成员变量_name和_age进行初始化,而不需要再在构造函数体内进行赋值操作。
- 构造函数体
除了成员初始化列表,我们还可以使用构造函数体对类成员变量进行初始化。在构造函数的参数列表后面不加冒号,而是直接将初始化语句写在{}之中。
示例2:
class Person {
public:
Person(string name, int age) {
_name = name;
_age = age;
}
private:
string _name;
int _age;
};
在这个例子中,我们通过构造函数体中的赋值语句来对Person类的两个成员变量_name和_age进行初始化。相比于成员初始化列表,构造函数体在语法上看起来更加灵活,可以在构造函数体中进行更加复杂的初始化操作。
- 区别详解
在使用成员初始化列表和构造函数体进行成员变量初始化时,二者的区别主要有以下两点:
3.1 执行顺序
成员初始化列表的执行顺序是按照成员变量在类中声明的顺序来进行的,在执行构造函数体之前就已经完成了全部的初始化操作。而构造函数体中的赋值语句的执行顺序是按照它们在代码中出现的顺序来进行的。
示例3:
class Person {
public:
Person(string name, int age): _name(name), _age(_name.length()), _height(180) {
_age = age;
}
private:
string _name;
int _age;
int _height;
};
在这个例子中,我们使用了成员初始化列表来对Person类的三个成员变量进行初始化。其中,_age的初始化操作包括了_name.length()的计算,_height的初始化操作使用了默认值180。在构造函数体中,我们又对_age进行了一次赋值操作。在最终的结果中,_height的值是180,_age的值是构造函数输入的值而不是_name.length(),这说明了成员初始化列表的执行顺序优先于构造函数体。
3.2 性能影响
使用成员初始化列表可以在对象被创建时一次性对成员变量进行初始化,避免重复执行赋值操作,因此会比使用构造函数体进行初始化更加高效。
示例4:
class Array {
public:
Array(int size): _size(size) {
_data = new int[size];
for (int i = 0; i < size; i++) {
_data[i] = i;
}
}
private:
int* _data;
int _size;
};
在这个例子中,我们使用构造函数体来对Array类的成员变量进行初始化。其中,初始化操作需要先分配一段内存空间,并对其中的元素进行遍历赋值。如果我们使用成员初始化列表来进行初始化,就可以避免重复分配内存和遍历赋值的操作,大大提升了性能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:成员初始化列表与构造函数体中的区别详细解析 - Python技术站