c++类和对象——对象组合的构造函数和析构函数详解

目录

对象组合的概念

对象组合的构造函数

对象组合的析构函数


前言:仅为巩固和完善上课内容所作,如有错误感谢指点

参考教材:《程序设计基础——以c++为例》

作者:hznu_AllanPoeeeeeee

最后编辑时间:2023.04.06

对象组合的概念

类的数据成员可以是基本数据类型(int,float等),可以是复合数据类型(数组、字符串、结构体等),也可以是对象。

组合:一个对象包含另一个对象。

组合类:内嵌了其他对象数据成员的类。

class Date{
public:
    ……
private:
    int year,month,day;
};
class Time{//组合类,Time类内嵌了Date类的数据成员
public:
    ……
private:
    Date start;//内嵌的Date类的对象
    Date end;//内嵌的Date类的对象
};
int main(){
    ……
    Date start(year,month,day);
    Date end(year,month,day);
    Time time(start,end);//组合,time对象包含了start对象和end对象
}

对象组合的构造函数

在组合类中,必须使用构造函数初始化列表来初始化对象数据成员。

class Time{
public:
    ……
    Time(int year,int month,int day){//拷贝构造函数
        this->year=year;this->month=month;this->day=day;
    } 
    Time(int year,int month,int day):year(year),month(month),day(day){}//构造初始化列表
public:
    int year,month,day;
};

在创建组合类的对象时,构造函数有调用顺序

        1.首先调用各内嵌对象数据成员的构造函数(按照对象数据成员的声明顺序:从左到右);

        2.然后执行组合类的构造函数;

class Date{
public:
    ……
    Date(int year,int month,int day){//可以使用拷贝构造函数,也可以使用初始化列表
        this->year=year;this->month=month;this->day=day;
    }
private:
    int year,month,day;
};
class Time{//组合类,Time类内嵌了Date类的数据成员
public:
    Time(int year1,int month1,int day1,int year2,int month2,int day2)
         :start(year1,month1,day1),end(year2,month2,day2){}//构造初始化列表
private:
    Date start;//内嵌的Date类的对象
    Date end;//内嵌的Date类的对象
};
int main(){
    ……
    Time time(1900,1,1,2000,2,2);
    ……
}
//也可以按下面这种方式,构造函数的参数由对象的定义决定。
class Time{//组合类,Time类内嵌了Date类的数据成员
public:
    Time(const Date &start,const Date &end):start(start),end(end){}//构造初始化列表
private:
    Date start;//内嵌的Date类的对象
    Date end;//内嵌的Date类的对象
};
int main(){
    ……
    Date start(year,month,day);
    Date end(year,month,day);
    Time time(start,end);//组合,time对象包含了start对象和end对象
    ……
}

对象组合的析构函数

析构函数的调用顺序和构造函数相反(先定义的后销毁,后定义的先销毁)。

#include
#include
using namespace std;
class Date{
public:
    Date(int year,int month,int day){//可以使用构造函数,也可以使用初始化列表
        this->year=year;this->month=month;this->day=day;
    }
    ~Date(){
        cout<<"销毁Date对象:"<name=name;
         }
    Time(const Date &start,const Date &end,string name):start(start),end(end){
        this->name=name;
    }
    ~Time(){
        cout<<"销毁Time对象:"<
输出结果为:
销毁Time对象:time2//先销毁第四个定义的time2对象
销毁Date对象:2010-12-12//销毁time2对象里后定义的end对象
销毁Date对象:1910-11-11//销毁time2对象里先定义的start对象
销毁Time对象:time1//再销毁第三个定义的time1对象
销毁Date对象:2000-2-2//销毁time1对象里后定义的end对象
销毁Date对象:1900-1-1//销毁time1对象里先定义的start对象
销毁Date对象:2010-12-12//后销毁第二个定义的end对象
销毁Date对象:1910-11-11//最后销毁第一个定义的start对象

你可能感兴趣的:(c++,开发语言)