封闭类的构造函数(P222)
/*
如果一个类的成员变量是另一个类的对象,则为封闭类。
定义封闭类构造函数的一般形式为:
类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表),~
{
类体
}
*在派生类也是封闭类的情况下,构造函数的初始化列表不但要指明基类对象的初始化方式,还要指明成员的初始化方式。
生成派生类对象时,会引发一系列构造函数的调用,顺序是:先根据派生类层次从上到下依次执行所有基类的构造函数,最后执行自身的构造函数。如果某个类是封闭类,则在执行本类构造函数之前,先按照成员对象的定义顺序执行各个成员对象所属类的构造函数。
a.在创建派生类对象时,类层次中构造函数的执行顺序是:由
派生类的参数初始化列表顺序决定的。
b.在创建派生类对象时,构造函数的执行顺序是:
对象成员构造函数——基类构造函数——派生类本身的构造函数
*/
//封闭类的构造函数
#include<iostream>
#include<string>
using namespace std;
class myDate
{
public:
myDate();
myDate(int);
myDate(int,int);
myDate(int,int,int);
myDate(const myDate &d);
~myDate();
void setDate(int,int,int);
void setDate(myDate);
myDate getDate();
void setYear(int);
int getMonth();
void printDate()const;
private:
int year,month,day;
};
myDate::myDate()
{
year=1970;
month=1;
day=1;
cout<<"myDate默认构造函数"<<endl;
}
myDate::myDate(int y)
{
year=y;
month=1;
day=1;
cout<<"myDate带1个构造函数"<<endl;
}
myDate::myDate(int y,int m)
{
year=y;
month=m;
day=1;
cout<<"myDate带2个构造函数"<<endl;
}
myDate::myDate(int y,int m,int d)
{
year=y;
month=m;
day=d;
cout<<"myDate带3个构造函数"<<endl;
}
myDate::myDate(const myDate &d)
{
year=d.year;
month=d.month;
day=d.day;
cout<<"myDate_COPY构造函数"<<endl;
}
myDate::~myDate()
{
cout<<"myDate析构函数"<<endl;
}
void myDate::setDate(int y,int m,int d)
{
year=y;
month=m;
day=d;
return;
}
void myDate::setDate(myDate oneD)
{
year=oneD.year;
month=oneD.month;
day=oneD.day;
return;
}
myDate myDate::getDate()
{
myDate d;
d.year=year;
d.month=month;
d.day=day;
return d;
}
void myDate::setYear(int y)
{
year=y;
return;
}
int myDate::getMonth()
{
return month;
}
void myDate::printDate()const
{
cout<<year<<"/"<<month<<"/"<<day;
return;
}
class CStudent
{
public:
CStudent();
CStudent(string,myDate);
~CStudent();
void setStudent(string,myDate);
void setName(string);
string getName();
void setBirthday(myDate);
myDate getBirthday();
void printInfo()const;
private:
string name;
myDate birthday;
};
CStudent::CStudent():name("Noname"),birthday(myDate())
{
cout<<"CStudent默认构造函数"<<endl;
}
CStudent::CStudent(string str,myDate d):name(str),birthday(d)
{
cout<<"CStudent有参构造函数"<<endl;
}
CStudent::~CStudent()
{
cout<<"CStudent析构函数"<<endl;
}
void CStudent::setStudent(string s,myDate d)
{
name=s;
birthday.setDate(d);
return;
}
void CStudent::setName(string n)
{
name=n;
return;
}
string CStudent::getName()
{
return name;
}
void CStudent::setBirthday(myDate d)
{
birthday.setDate(d);
return;
}
myDate CStudent::getBirthday()
{
return birthday;
}
void CStudent::printInfo()const
{
cout<<"姓名:"<<name<<"\t生日:";
birthday.printDate();
cout<<endl;
}
class CUndergraduateStudent:public CStudent
{
private:
string department;
public:
CUndergraduateStudent();
CUndergraduateStudent(string,myDate);
~CUndergraduateStudent();
void setDep(string);
void printInfo()const;
};
CUndergraduateStudent::CUndergraduateStudent()
{
cout<<"CUndergraduateStudent默认构造函数"<<endl;
}
CUndergraduateStudent::CUndergraduateStudent(string str,myDate d):CStudent(str,d)
{
cout<<"CUndergraduateStudent有参构造函数"<<endl;
}
CUndergraduateStudent::~CUndergraduateStudent()
{
cout<<"CUndergraduateStudent析构函数"<<endl;
}
void CUndergraduateStudent::setDep(string dep)
{
department=dep;
}
void CUndergraduateStudent::printInfo()const
{
CStudent::printInfo();
cout<<"院系:\t"<<department<<endl<<endl;
}
int main()
{
CUndergraduateStudent s2("小张",myDate());
return 0;
}

浙公网安备 33010602011771号