C++组合类

        类的数据成员不但可以是基本类型,也可以是其它类的对象。
        组合类就是指一个类包含其他类的对象作为该类的数据成员。

        当组合类创建对象时,其中包含的各个数据成员对象应首先被创建。因此,在创建类的对象时,既要对本类的基本类型数据成员进行初始化,同时也要对数据成员对象成员进行初始化。

        组合类构造函数的定义格式为:

类名::类名(形参表):成员对象1(形参表),成员对象2(形参表),……
{
    //类的初始化
}

        需要注意以下几点。
        (1)类的构造函数,不仅要考虑对本类数据成员的初始化工作,而且也要考虑成员对象的初始化工作。
        (2)在创建一个组合类的对象时,不仅它自身的构造函数将被调用,且其成员对象的构造函数也将被调用。这时构造函数调用的顺序为:

● 调用成员对象的构造函数,调用顺序按照成员对象在类的声明中出现的先后顺序依次调用(考点),与初始化表中顺序无关;

● 执行本类构造函数的函数体;
● 析构函数的调用顺序与构造函数刚好相反。

        (3)若调用缺省构造函数(即无形参的),则成员对象的初始化也将调用相应的缺省构造函数。
        (4)组合类同样有拷贝构造函数。若无则调用默认的拷贝构造函数。
        例:组合类的应用


#include <iostream>
#include <string>
using namespace std;

class Date
{
public:
    Date(int y, int m, int d) :year(y), month(m), day(d) //构造函数
    {
        cout << "Date构造函数,对象的地址:" << this << endl;
    }
    //拷贝构造函数
    Date(const Date& date) :year(date.year), month(date.month), day(date.day)
    {
        cout << "Date拷贝构造函数,对象的地址:" <<this<< endl;
    }
    ~Date()
    {
        cout << "Date析构函数,对象的地址:" <<this<< endl;
    }
private:
    int year; //年
    int month;//月
    int day;  //日
};

class Student
{
public:
    Student(string n, int i, int y,int m,int d) :name(n), id(i), bir(y,m,d)
    {
        cout << "Student构造函数,对象的地址:" <<this<< endl;
    }
    Student(const Student& s) :name(s.name), id(s.id), bir(s.bir)
    {
        cout << "Student拷贝构造函数,对象的地址:" << this<<endl;
    }
    ~Student()
    {
        cout << "Student析构函数,对象的地址:" <<this<< endl;
    }
private:
    string name;//姓名
    int id;     //学号
    Date bir;   //出生年月
};

int main()
{
    Student stu1{"张三",12345,2004,6,13};
    cout << "stu1的地址:" << &stu1 << endl;

    Student stu2(stu1);
    cout << "stu2的地址:" << &stu2 << endl;

    return 0;
}

执行结果如下:

1.png

 分析:
        1.第50行,定义对象stu1,需要调用Student的构造函数,但由于它包含Date类成员,所以在调用Student的构造函数前先调用Date的构造函数,然后再调用Student本身的构造函数。
        2.第53行,通过stu1拷贝构造stu2,这是先调用其成员对象的拷贝构造函数,然后再调用Student本身的拷贝构造函数。
        3.析构函数的调用刚好和构造函数的调用过程相反。

例如:组合类成员对象构造的顺序


#include <iostream>
#include <string>
using namespace std;

class Date
{
public:
    Date(int y, int m, int d) :year(y), month(m), day(d) //构造函数
    {
        cout << "Date构造函数"<< endl;
    }
    ~Date()
    {
        cout << "~Date析构函数"<< endl;
    }
private:
    int year; //年
    int month;//月
    int day;  //日
};

class Address //地址
{
public:
    Address(string p, string c) :province(p), city(c)
    {
        cout << "Address构造函数" << endl;
    }
    ~Address()
    {
        cout << "~Address析构函数" << endl;
    }
private:
    string province;//省份
    string city;//市
};

class Student
{
public:
    Student(string n, int i, int y,int m,int d,string p,string c) :addr(p,c),name(n), id(i), bir(y,m,d)
    {
        cout << "Student构造函数" << endl;
    }
    ~Student()
    {
        cout << "~Student析构函数"<< endl;
    }
private:
    string name; //姓名
    int id;      //学号
    Date bir;    //出生年月
    Address addr;//家庭住址
};

int main()
{
    Student stu1{"张三",12345,2004,6,13,"陕西省","西安市"};

    return 0;
}

程序执行结果如下:

1.png

相关推荐

  1. CSS逻辑组合

    2024-05-13 01:24:02       44 阅读
  2. <span style='color:red;'>C</span> ++<span style='color:red;'>类</span>

    C ++

    2024-05-13 01:24:02      42 阅读
  3. C++ :

    2024-05-13 01:24:02       35 阅读
  4. <span style='color:red;'>C</span>++ <span style='color:red;'>类</span>

    C++

    2024-05-13 01:24:02      11 阅读
  5. C/C++ - 模板

    2024-05-13 01:24:02       30 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-13 01:24:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-13 01:24:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-13 01:24:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-13 01:24:02       20 阅读

热门阅读

  1. Leetcode 3147. Taking Maximum Energy From the Mystic Dungeon

    2024-05-13 01:24:02       13 阅读
  2. 前端工程化之---git hooks

    2024-05-13 01:24:02       10 阅读
  3. Git 剔除已经纳入版本管理的文件

    2024-05-13 01:24:02       8 阅读
  4. 代码随想录:二分查找相关题目推荐(35、34)

    2024-05-13 01:24:02       11 阅读
  5. 关于fmt的用法

    2024-05-13 01:24:02       8 阅读
  6. 【C++】string类的模拟实现

    2024-05-13 01:24:02       10 阅读
  7. HashMap在Jdk1.8之前并发扩容下的死循环

    2024-05-13 01:24:02       10 阅读
  8. QT作业4

    QT作业4

    2024-05-13 01:24:02      10 阅读