一,引言
在类中成员函数的构造函数担任其将对象初始化的作用,而初始化列表也有着相似的作用。大部分人建议都是初始化列表进行初始化,本文主要进行讲解二者的区别。
首先看一下构造函数的初始化方式:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class date
{
public:
date(int year = 1900, int month = 1, int day = 1)
{
//
_year = year;
_month = month;
_day = day;
}
private:
int _day;
int _month;
int _year;
};
int main()
{
date s1;
date s2;
return 0;
}
当定义对象时,自动调用构造函数,对对象进行初始化。
下面看一下初始化列表:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class date
{
public:
date(int year = 1900, int month = 1, int day = 1)
:_year()
,_month()
,_day()
{
//
//_year = year;
//_month = month;
//_day = day;
}
private:
int _day;
int _month;
int _year;
};
int main()
{
date s1;
date s2;
return 0;
}
两种都是对对象进行初始化,实际上通过看编译器的运行过程,发现两种并没有关系,
编译器会首先走初始化列表,之后走构造函数的主体内容。也就是说不管写不写初始化列表都要走构造函数的主体内容。
下面看一个例子:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class date
{
public:
date(int year = 1900, int month = 1, int day = 1)
:_year(2014)
,_month(1)
,_day(1)
{
//
_year = year;
_month = month;
_day = day;
}
private:
int _day;
int _month;
int _year;
};
int main()
{
date s1(2025,12,2);
date s2;
return 0;
}
首先走初始化列表
对象的三个成员的值为初始化列表的值。
之后走构造函数的主体
这就说明不管有没有初始化列表和构造函数的主体是否执行没有关系。
进而说明两者本质上是没有关系的。