构造函数初始化列表
2018-09-18 本文已影响21人
Jowney
一、抛砖引玉--抛转
在写C++类的时候你应该有一个疑问!C++中, 类的成员变量在定义的时候为什么不直接初始化?为什么?为什么?为什么?
class Stu //声明一个学生类
{
private: //私有成员关键字
char Name[32] = "张三"; //姓名
int ID = 1; //学号
int Score = 001; //成绩
};
因为Java是自动挡汽车,C++是手动挡汽车。在java里这样写是没毛病的,因为Java已经默默地为我们做了许多事情。但是在C++里面这样搞是要出问题的。解析如下↓↓↓↓↓↓↓↓↓
class Stu //声明一个学生类
{
private: //私有成员关键字
char Name[32]; //姓名
int ID; //学号
int Score; //成绩
public: //外部成员关键字
Stu() //无参构造函数
{
strcpy(Name,"无");
ID=0;
Score=0;
}
};
这个类在没有被实例化之前它就只是一个类一个模板,在栈中或堆中没有与它相关的内存,当实例化这个类的时候奇妙的事情就要发生了。
当实例化Stu类时,第一步会声明该类的三个全局变量(注意这个时候Stu类还没分配内存,所以你在写Stu类时直接初始化这三个变量,肯定会报错啊!),紧接着就会调用Stu类中的构造函数。
构造函数是干嘛的?
■ 给创建的对象建立一个标识符;
■ 为对象数据成员开辟内存空间;
■ 完成对象数据成员的初始化。
注意第二条,“为对象数据成员开辟内存空间”,也就是调用该方法后,Stu就被实例化了,同时三个变量也被分配了内存空间,也就是说三个变量就算不在构造方法中初始化,它们也会强制初始化(但是具体的值是多少,代表什么意思我还没仔细考虑过)。也就是说,紧接着如果构造函数的函数体里面中有全局变量的赋值操作的话,也不能是算是头茬了。。。这个时候就有一个很大的问题,对于引用,const变量来说,该怎么办?这些难缠的家伙可是声明的时候就需要初始化的,而且不能修改变量的值。
二、抛砖引玉--引玉
这个时候“构造函数初始化列表”就派上作用了,听听这名字“构造函数”、“初始化列表”,一听就知道用来干嘛的,给变量分配内存空间的同时初始化。。。牛叉。。。想的真周到。。。