C++类的组合

news2024/9/20 20:35:11

C++类的组合

  • 什么是类的组合
  • 初始化参数列表
    • 使用
    • 类的组合案例分析
    • 组合构造和析构顺序问题
  • this指针
      • 基本用法和作用

什么是类的组合

类的组合就是以另一个对象为数据成员,这种情况称为类的组合

1.优先使用类的组合,而不是继承
2.组合表达式的含义 一部分关系

初始化参数列表

初始化参数列表,是构造函数的另一种写法

使用

初始化参数列表的形态
构造函数名(形参1, 形参2…) : 数据成员1(形参1), 数据成员2(形参2)…

#include<iostream>
#include<string>

using namespace std;

class MM
{
public:


	MM(int age, string name) : age(age), name(name)
	{

	}

	void printDate()
	{
		cout << age << " " << name;

	}

private:
	int age;
	string name;
};

int main()
{
	MM mm(19, "温柔了岁月");
	mm.printDate();

	system("pause");
	return 0;
}

初始化列表的其他写法

无参构造函数

#include<iostream>
#include<string>

using namespace std;


class MM
{
public:

	//无参构造函数
	MM() : age(18), name("温柔了岁月")
	{

	}

	void printDate()
	{
		cout << age << " " << name;

	}

private:
	int age;
	string name;
};

int main()
{
	MM mm;
	mm.printDate();

	system("pause");
	

类的组合案例分析

1.类组合包含的类的对象,必须采用初始化参数列表的方式去初始化
2.组合中初始化参数列表的写法:
构造函数名(形参1, 形参2, 形参3,…) : 对象1(形参1, 形参2), 对象2(形参3,…)

//组合类
#include<iostream>
#include<string>

using namespace std;

class MM1
{
public:
	MM1()
	{
		cout << "MM1号" << endl;
	}

private:
	int age;
	string name;

};

class MM2
{
public:
	MM2()
	{
		cout << "MM3号" << endl;
	}

private:
	int age;
	string name;

};

class MM3
{
public:
	MM3()
	{
		cout << "MM3号" << endl;
	}

private:
	int age;
	string name;
};

class MM
{
	void show()
	{
		
	}
private:         //其他三个类,都放在一个类中,当做一个数据类型进行使用  
	MM1 mm1; 
	MM2 mm2;
	MM3 mm3;
};
int main()
{
	MM mm;

	system("pause");
	return 0;
}

在这里插入图片描述

这是一个简单的类的组合,没有进行传参,
类的组合中,优先构造包含对象,再构造自身的对象
下面是传了形参的组合类

#include<iostream>
#include<string>

using namespace std;

class MM1
{
public:
	MM1(int age, string name)
	{
		cout << "MM1号" << endl;
	}

	void printDate()
	{
		cout << "MM3号" << endl;
	}

private:
	int age;
	string name;

};

class MM2
{
public:
	MM2(int age, string name)
	{
		cout << "MM3号" << endl;
	}

	void printDate()
	{
		cout << "MM3号" << endl;
	}
private:
	int age;
	string name;

};

class MM3
{
public:
	MM3(int age, string name)
	{
		cout << "MM3号" << endl;
	}

	void printDate()
	{
		cout << "MM3号" << endl;
	}

private:
	int age;
	string name;
};

class MM
{
public:

	MM(int x1,string y1, int x2, string y2, int x3, string y3): mm1(x1, y1), mm2(x2, y2),mm3(x3, y3){}
	
	void Print()
	{
		mm1.printDate();
		mm2.printDate();
	
		mm3.printDate();
	}

	MM1 getmm1()//访问数据成员
	{
		return mm1;
	}

	MM2 getMM2()
	{
		return mm2;
	}

	MM3 getMM3()
	{
		return mm3;
	}

private:         
	//构造顺序与此处有关,与初始化列表的顺序无关
	MM1 mm1;
	MM2 mm2;
	MM3 mm3;
};
int main()
{

	MM mm(1, "温柔", 2, "了", 3, "岁月");
	mm.Print();
	//mm.getmm1().printDate();//可以这样写

	system("pause");
	return 0;
}

指针的运用(new)

#include<iostream>

using namespace std;

class A
{

	
public:

	A(int a) : a(a)
	{

	}

	 int& getA()
	{
		 return a;
	}
private:
	int a;
};

class B
{
public:
	B(int b): b(b)
	{

	}

	int& getB()
	{
		return b;
	}
private:
	int b;
};

class C
{
public:
	C()
	{
		pa = new A(10);    //方法一:直接赋值
		pb = new B(123);
	}

	C(int a, int b) :pa(new A(10)), pb(new B(12))  //方法二,new的初始化列表
	{

	}

	void printDate()
	{
		cout << pa->getA() << endl;
		cout << pb->getB() << endl;
	}

private:
	A* pa;
	B* pb;
};

int main()
{
	C c;
	c.printDate();

	system("pause");
	return 0;
}

组合构造和析构顺序问题

1.一般构造顺序和析构顺序是相反的
2.类的组合中,优先构造包含对象,在构造自身对象
3.类的组合中,包含对象的构造顺序只和定义顺序有关,和初始化参数列表无关

this指针

任何指针都存在一个this指针,this指针只允许在类中的函数的函数中使用

避免形参名和数据成员的命名相同

基本用法和作用

this指针代表的是每个对象抽象的地址

#include<iostream>
#include<string>

using namespace std;

class MM
{
public:
	MM(int age, string name)
	{
		this->age = age;   //可以用this指针来进行区分
		MM::name = name;  // 类加作用域,来进行区分
 	}
private:
	int age;
	string name;
};
int main()
{
	system("pause");
}

其他作用
1.返回对象本身
2.返回对象地址

MM& returnMM() //返回对象本身
	{
		return *this;
	}

	MM* returnM()
	{
		return this; //返回对象地址
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用户登录请求100w/每天, JVM如何调优

用户登录请求100w/每天, JVM如何调优 大概可以分为以下8个步骤。 Step1&#xff1a;新系统上线如何规划容量&#xff1f; 1.套路总结 任何新的业务系统在上线以前都需要去估算服务器配置和JVM的内存参数&#xff0c;这个容量与资源规划并不仅仅是系统架构师的随意估算的&am…

springboot启动过程加载数据笔记(springboot3)

SpringApplication AbstractApplicationContext PostProcessorRegistrationDelegate ConfigurationClassPostProcessor ConfigurationClassParser 一堆循环和调用 ComponentScanAnnotationParser扫描 processConfigurationClass.doProcessConfigurationClass(configClass, so…

网络编程(二)

6. TCP 三次握手四次挥手 HTTP 协议是 Hype Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写&#xff0c;是用于从万维网&#xff08;WWW&#xff1a;World Wide Web&#xff09;服务器&#xff08;sever&#xff09;传输超文本到客户端&#xff08;本地浏览器…

小众但意外觉得蛮好用的剪辑软件!纯良心分享

爱剪辑 有开屏广告&#xff0c;一共3个界面&#xff1a;首页、剪同款、我的。 剪辑、配乐、字幕、滤镜、加速、贴纸、配音等主流功能都有。 特色功能有剪裁视频、倒放视频、视频旋转、视频转换GIF、转场、提取音频、画中画等。 还可以拼接视频&#xff0c;不过不支持FLV等小众文…

人员摔倒识别预警系统 人员跌倒检测算法 yolov7

人员摔倒识别预警系统 人员跌倒检测算法基于yolov7网络模型计算机识别技术&#xff0c;人员摔倒识别预警系统 人员跌倒检测算法对画面中人员摔倒进行实时检测识别抓拍告警。YOLOv7 的策略是使用组卷积来扩展计算块的通道和基数。研究者将对计算层的所有计算块应用相同的组参数和…

buuctf-pwn write-ups (11)

文章目录buu083-x_ctf_b0verfl0wbuu084-picoctf_2018_leak_mebuu085-inndy_echobuu086-hitcontraining_unlinkbuu087-ciscn_2019_final_3buu088-axb_2019_fmt64buu089-wustctf2020_name_your_catbuu090-pwnme1buu091-axb_2019_brop64buu092-[极客大挑战 2019]Not Badbuu083-x_c…

JAVA开发运维(nginx工作原理)

nginx源码目录结构&#xff1a; . ├── auto 自动检测系统环境以及编译相关的脚本 │ ├── cc 关于编译器相关的编译选项的检测脚本 │ ├── lib nginx编译所需要的一些库的检测脚本 │ ├── os 与平台相关的一些系统参数…

2023-03-06 debian11 最小安装记录

1.镜像准备&#xff0c;根据个人需求下载debian 版本Debian -- 获取 Debian2.上传到VSAN 内容库我这边是在vm里面安装的&#xff0c;就直接上传到内容库备用&#xff08;根据个人需求存放&#xff09;3.分配虚拟主机配置根据个人需要配置4.开始最小安装1.在界面中选择Install&a…

Packet Tracer--配置帧中继

Packet Tracer--配置帧中继 拓扑图&#xff1a; 设备参数: 设备 接口 DLCI R1 S0/2 102,103 R2 S0/2 201 R3 S0/2 301 R1---R2 Se1&#xff1a;102-----Se2&#xff1a;201 R1---R3 Se1&#xff1a;103-----Se3&#xff1a;301 IP参数 设备 接口 IP地址…

CFNet: Cascade Fusion Network for Dense Prediction

论文名称&#xff1a;CFNet: Cascade Fusion Network for Dense Prediction 论文下载&#xff1a;https://arxiv.org/pdf/2302.06052.pdf 论文代码&#xff1a;GitHub - zhanggang001/CFNet: CFNet: Cascade Fusion Network for Dense Prediction 摘要&#xff1a; 在密集预…

十四届蓝桥选拔赛Scratch-2023.02.12 试题解析

十四届蓝桥选拔赛Scratch-2023.02.12 试题解析 单选题: 1. 运行以下程序,小猫和小企鹅谁能到达舞台右侧边缘? ( B ) *选择题严禁使用程序验证,选择题不答和答错不扣分 A. 小企鹅 B. 小猫 C. 都能到达 D. 都不能到达 2. 运行以下程序(小象仅有两个造型),小象的造型是…

最简单的SpringBoot+MyBatis多数据源实现

最简单的SpringBootMyBatis多数据源实现1.数据库准备2.环境准备3.代码部分3.1多数据源配置2.测试随着应用用户数量的增加&#xff0c;相应的并发请求的数量也会跟着不断增加&#xff0c;慢慢地&#xff0c;单个数据库已经没有办法满足频繁的数据库操作请求了&#xff0c;在某些…

【JeecgBoot-Vue3】第4节 目录结构与常用组件介绍

一、项目的目录结构讲解 1. src/api/ 存放API相关信息 src/api/存放的是调用后台api接口相关信息src/api/commonapi.tsapi接口信息2. src/assets 静态资源 src/assets静态资源 src/assets/icons 图标 src/assets/images 图片 src/assets/less 样式src/assets/svgsvg图像3. s…

函数编程:强大的 Stream API

函数编程&#xff1a;强大的 Stream API 每博一文案 只要有人的地方&#xff0c;世界就不会是冰冷的&#xff0c;我们可以平凡&#xff0c;但绝对不可以平庸。—————— 《平凡的世界》人活着&#xff0c;就得随时准备经受磨难。他已经看过一些书&#xff0c;知道不论是普通…

Python API教程:API入门

什么是API&#xff1f; 一个API&#xff0c;或被称为应用程序接口&#xff0c;是一个服务器为你提供一个接收或发送数据的代码。API通常用来接收数据。 本文就集中焦点在此话题中。 当我们想从一个API中接收数据&#xff0c;我们需要开始请求。请求可以包含整个Web。例如&am…

Vue基础18之github案例、vue-resource

Vue基础18github案例静态页面第三方样式引入&#xff08;以bootstrap举例&#xff09;App.vueSearch.vueList.vue列表展示接口地址使用全局事件总线进行兄弟间组件通信Search.vueList.vue完善案例List.vueSearch.vue补充知识点&#xff1a;{...this.info,...this.dataObj}效果呈…

Serverless

Serverless&#xff1a;云计算的下一个十年 最近几年的技术圈&#xff0c;对于 Serverless 技术的讨论异常火热&#xff0c;在业内也有了很多成熟的案例&#xff0c;国外发展较早&#xff0c;比较有代表性的就是亚马逊和谷歌&#xff0c; 而在国内&#xff0c;腾讯和阿里两位巨…

Maven使用教程

1.什么是Maven&#xff1f; 当我们在创建一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量极多&#xff0c;并且Jar包之间的关系错综复杂&#xff0c;一个Jar包往往又会引用其他Jar包&#xff0c;缺少任何一个Jar包都会导致项目编译失败。 以往开发项目时…

GraphPad Prism v9.5.1.733 科研绘图软件多语言

GraphPad Prism集生物统计、曲线拟合和科技绘图于一体,其所具有的功能均非常实用和精炼,包括了一些特色的功能,如ROC曲线分析、Bland-Altman分析等;曲线拟合功能是GraphPad Prism8 汉化版超越其他统计软体的制胜法宝,GraphPad Prism8 汉化版的线性/非线性拟合功能使用操作…

JVM运行时数据区—Java虚拟机栈

虚拟机栈的背景 由于跨平台性的设计&#xff0c;java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 根据栈设计的优点是跨平台&#xff0c;指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同样的功…