当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/347181.html

相关文章:

  • Linux学习笔记3
  • 免费证件照一键换底色
  • 使用 FFmpeg 从音视频中提取音频
  • GraphQL在现代Web应用中的应用与优势
  • socket编程 学习笔记 理解
  • SC-Lego-LOAM建图与ndt_localization的实车实现
  • vs code中如何使用git
  • Vue项目中如何通过配置修改项目名称
  • ThinkPHP5.1 创建控制器类
  • 完全背包问题(c++)
  • 综合性练习(验证码案例)
  • 实用的Chrome命令 帮你打开Chrome浏览器的隐藏功能
  • Linux提权--定时任务--打包配合 SUID(本地)文件权限配置不当(WEB+本地)
  • CSS-盒子模型
  • WPF之页的使用
  • 【FFmpeg】Filter 过滤器 ② ( 裁剪过滤器 Crop Filter | 裁剪过滤器语法 | 裁剪过滤器内置变量 | 裁剪过滤器常用用法 )
  • thinkphp5 中控制器的创建和使用方法
  • [Linux] 常用服务器命令(持续更新)
  • 编译官方原版的openwrt并加入第三方软件包
  • PC适配移动端
  • springboot+vue+mybatis灵活就业服务平台+PPT+论文+讲解+售后
  • Android 13 系统自定义安全水印
  • C# WCF服务(由于内部错误,服务器无法处理该请求。)
  • 利用github pages建立Serverless个人博客
  • Spring Boot 集成 sa-token 实践教程
  • CSS:盒子模型
  • django中的cookie与session
  • 环形链表(判断链表中是否有环)的讲解
  • NLP(14)--文本匹配任务
  • MySQL——系统变量