初始化列表和构造函数初始化的区别是什么?
初始化和赋值对内置类型的成员没有太大的区别,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的。只有一些需要注意的事项
初始化列表一般情况如下:
Date(int year, int month, int day) : _year(year) , _month(month) , _day(day)
构造函数初始化一般通过构造函数实现,示例:
#include<iostream>
using namespace std;
class Date
{
public:
Date(int year, int month, int day) {
this->_day = day;
this->_month = month;
this->_year = year;
}
private:
int _year;
int _month;
int _day;
};
上面的构造函数(使用初始化列表的构造函数)显示地初始化类的成员,
而没有使用初始化列表的构造函数是对类的成员赋值,并没有进行显示的初始化。
注意事项
1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
2. 类中包含以下成员,必须放在初始化列表位置进行初始化:
-
引用成员变量
-
const成员变量
-
类类型成员(该类没有默认构造函数)
#include
using namespace std;
class Date
{
public:
Date(int year, int month, int day) {
this->_day = day;
this->_month = month;
this->_year = year;
}private:
int _year;
int _month;
int _day;int & _ref;//引用 const int xxxxx;//const成员变量 Date _lei;//类类型成员
};
3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使 用初始化列表初始化
哪怕自己没有初始化列表,编译器自己会加初始化列表,效率会高一些。
4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
尽量不要使用成员初始化成员
类的成员变量的初始化顺序是按照声明顺序吗
在c++中,类的成员变量的初始化顺序只与变量在类中的声明顺序有关,与在构造函数中的初始化顺序无关,而且静态成员变量先于实例变量,父类成员变量先于子类成员变量父类析构函数先于子类构造函数
class Test{
public:
Test(){
};
Test::Test()n2(2), n1(1)
private:
int n1;
int n2;
};
成员变量的初始化次序跟变量在内存中的次序有关,而内存中的排列顺序早在编译期就根据变量的定义决定了
从全局看,变量的初始化顺序如下:
- 基类的静态变量或全局变量
- 派生类的静态变量或全局变量
- 基类的成员变量
- 派生类的成员变量