类的初始化列表以及const & static修饰成员
一:初始化列表
我们上一篇博客知道了对象的生成过程中,对象开辟了内存空间后就要进行初始化,而我们当时是这样初始化的:
现在,我们有另一种方法,也可以完成初始化:
我们看到第一步和第三步可以交给初始化列表完成,其实这两种方法都可以进行初始化,看个人喜好进行选择,不过有一些特殊情况只能选择第二种:
比如:
特殊情况1:类中的某些成员,其本身就是一个类或者结构,那么我们只能通过初始化列表对其进行初始化(需要初始化的数据成员是对象)
例如:类Student中的成员变量:
其中的birth是一个类Date实例化生成的一个对象:
那么我们可以看看类Student的构造函数以及拷贝构造函数对类Date生成的birth对象是如何进行初始化的:
#include <iostream>
class Date
{
public:
Date(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
private:
int year;
int month;
int day;
};
class Student
{
public:
Student(char* name, int id, float score, int y, int m, int d):birth(y, m, d), mid(id)
{
mname = new char[strlen(name) + 1];
strcpy(mname, name);
//mid = id;
mscore = score;
}
Student(const Student& rhs) :birth(rhs.birth)//Date birth = rhs.birth;
{
mname = new char[strlen(rhs.mname) + 1]();
strcpy(mname, rhs.mname);
mid = rhs.mid;
mscore = rhs.mscore;
}
Student& operator=(const Student& rhs)
{
if (this != &rhs)
{
delete[] mname;
mname = new char[strlen(rhs.mname) + 1];
strcpy(mname, rhs.mname);
mid = rhs.mid;
mscore = rhs.mscore;
}
return *this;
}
~Student()
{
delete[] mname;
mname = NULL;
}
private:
char* mname;
int mid;
float mscore;
Date birth;//class Date类
};
int main()
{
Student st1("zhangsan", 1, 96.5, 1996, 12, 15);
return 0;
}
特殊情况2:类中的某些成员,其本身就是一个常成员变量或者引用成员变量,那