C++基础语法:类包含

前言

       "打牢基础,万事不愁" .C++的基础语法的学习

引入

        类包含的理解和使用

类的回顾

        在前面帖子中(自用)关于程序的一些概念2:类和文件简单把类分成了数据类,动作类,组合类.数据类没有"动作",成员方法只有"set"和"get"方法;比如一颗白菜;动作类有"数据"和"动作".比如一个人;组合类的属性可以是数据类对象,动作类对象,其他组合类对象,可以"指挥"做出一套"动作",比如一个餐饮部门.其实设计模式就是专门研究类与类之间关系的,还被独立成一门课(笔者如果觉得对此有些理解,再行分享).先大致对类有个了解.

类包含

        一.类包含和类继承 

        <<C++ Prime Plus>> 6th Edition(以下称为"本书")上说的是:"类包含拥有被包含类的实现,类继承拥有被继承类的实现和接口" .读起来有些拗口,其实他们很容易区分---类包含拥有实在的数据,而类继承可理解成生成了新的数据类型,但没有数据产生.此外基类的虚方法可以有定义,派生类可以在实现的虚方法中使用基类所定义的虚方法.顺带一提.

        二.类包含的条件

        一个类包含其他类对象的前提,是被包含类可见. 通常在当前类包含了被包含类的头文件就可以了,如果被包含类被放在命名空间中,则需要加上using编译指令或者using声明.这个比较简单.内部类对于外部类直接可见.

        三.类包含的目的

        类包含可以是类型对象,指针(用以表示数组或者结点).类包含可以获得或者修改被包含数据,以得到某种结果.内置数据类型如int,double,string等没在包含数据类型之列,同样可以获得或修改.

        举例:

#include<iostream>
#include<vector>
using namespace std;
class Teacher {							//教师类
	string name;
public:
	Teacher(string na):name(na){}
	void judge() { cout << name<<"批改作业" << endl; }
	void showname() { cout << "名字是:" << name << endl; }
};

class Student {							//学生类
	string name;
public:
	Student(string na) :name(na) {}
	void homework() { cout << "写作业" << endl; }
	void showname() { cout << "学生名字是:" << name << endl; }
};

class Class {							//班类
	int grade;							//班是哪个年级
	int classname;						//班是第几班
	Student* students;					//班里有多个学生
	vector<Teacher> teachers;			//班有多个教师
public:
	Class(Student* st,vector<Teacher> & te,int gr,int cl):students(st),teachers(te),grade(gr),classname(cl){}
	Class() {};							//给默认构造函数,可以不写内容,不会报错会有警告未初始化变量
	Student getFirstStudent() {			//获得学生表里第一个学生
		return students[0];
	}
	Teacher getFirstTeacher() {			//获得老师表里第一个老师
		return teachers.at(0); 
	}
	Class gfs() {						//这个函数看起来有些奇怪,迭代器里会用到访问数据,返回本类对象
		Class t;
		t.students = this->students;
		return t;
	}
};

int main(void) {
	Teacher Zhang("张老师");
	Teacher Lee("李老师");
	vector<Teacher> teachers;			//建立Teacher的容器,放入张老师和李老师
	teachers.push_back(Zhang);
	teachers.push_back(Lee);

	Student xiaoming("小明");
	Student xiaohong("小红");
	Student a[]= { xiaoming,xiaohong };	//对象小明和小红放入对象数组
	Student* students = a;				//声明对象指针指向数组
	Class sanYi = Class(students, teachers,3,1);//生成对象3年级1班
	sanYi.getFirstStudent().showname();
	sanYi.getFirstTeacher().judge();
}

(代码写得很简单,没有多大具体含义.只访问传入属性,而没有修改) 

----说明:面向对象的编程方式和面向过程不同,但最终都是面向过程的,因为程序的运行依赖的是一条一条函数的调用.面向过程是直接调用,面向对象是先生成对象再调用.类包含也可以看作代码整合的一种方式.程序就像一条不断向前的运输带,包含的类就像一个个被放上去的货物.

        打个比方:餐厅有做炒菜的,有做冷盘的,还有熬汤的师傅,分别为他们写个类A,类B,类C.现在需要一桌菜,需要这三位师傅来做.可以建立一个类Cooking去整合他们,把三位师傅包含进来,一桌菜式用一个成员方法fun1(),多种菜式可以设置多个成员方法fun2(),fun3().... 

        再进一步,如果现在还有一位做蒸菜的师傅D要进来,这时可以考虑几种方案.一是建立另一个类Cooking2去包含ABCD四个师傅,二是把原来的Cooking做基类,生成一个派生类CookingPlus去整合.三可以用接口管理,接口的范围可以很宽,接口里还可以调用其他接口方法.  ----这段内容可以做了解,因为和设计模式有关联,笔者也在摸索,只是一说

=============================内容分割线====================================

        没有用到的那个函数gfs()是迭代器里面会用到的写法,原理很简单:不同的对象对应不同的属性.虽然迭代器是容器内已经实现了的代码,不需要再去写,他的思路是:当访问了数据集合中某个数据,返回对应的迭代器对象,然后用迭代器去遍历数据,产生指针遍历数据集合写法的效果. 类包含的成员方法可以修改和访问数据(属性),生成新对象也可以用来修改和访问数据  

=============================内容分割线====================================

互相包含的尝试

        两个类可以互相包含吗,一个类拥有另一个类的指针.

        代码思路:调用时让先生成一个类的对象first,设属性:另一个类对象指针指空;再将first作为属性,生成第二个类对象second;此时再将对象first的指针属性设为second;

======================能通过编译无法运行====================================

以下代码不可用

#include<iostream>
using namespace std;

class TmpTwo {										//类TmpTwo
	TmpOne* to;
	string name;
public:
	TmpTwo(TmpOne * t,string na):to(t),name(na){}
	TmpTwo() {										//默认属性:指针指空
		to= 0;
		name="good";
	};
	string getName(){ return name; }				//get姓名
	void setName(const string& na) { name = na; }	//set姓名
	TmpOne* getTO() const { return to; }			//获得指针属性值
	void setTO(TmpOne* t)  {to=t ; }				//设置指针属性值
};
class TmpOne {
	TmpTwo* tt;
	int age;
public:
	TmpOne(TmpTwo* t, int ag) :tt(t), age(ag) {}
	TmpOne() {										//默认属性:指针指空
		tt = 0;
		age = 0;
	};
	int getAge() const { return age; }				//get年龄
	void setAge(int ag) { age = ag; }				//set年龄
	TmpTwo* getTt() const { return tt; }
	void setTt(TmpTwo* t) { tt = t; }
};

int main(void) {
	TmpOne* to=new TmpOne();						//生成TmpOne*对象to,此时属性TmpTwo*指空
	TmpTwo* tt=new TmpTwo(to, "good");				//将to传入,生成TmpTwo*对象tt
	to->setTt(tt);									//设置对象to的TmpTwo*属性为tt
	to->setAge(18);
	cout << "从TmpTwo访问到的数据为:" << tt->getTO()->getAge() << endl;
}

======================能通过编译无法运行====================================

         这种写法有点像"先有鸡还是先有蛋",一般不认为这是正常逻辑,所以编译器也不让通过

小结

        对类包含的一些分析 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络连接线相关问题

问题1&#xff1b; 直通线为什么两头都是T568B&#xff1f;是否可以两台T5568A&#xff1f;或者任意线序&#xff0c;只需两头一致&#xff1f; 不行&#xff0c;施工规范规定。&#xff08;原因&#xff1b;网线最长距离100m&#xff0c;实际用起来要把网线包管&#xff0c;走…

Kafka第四篇——生产数据总体概括,源码解析分区策略,数据收集器,Sender发送线程,key值

目录 流程图以及总体概述 拦截器 分区器以及分区计算策略 为啥进行分区计算&#xff1f; producer生产者怎么知道有哪些分区&#xff1f; 分区计算 如何自定义实现分区器&#xff1f; 想说的在图里啦&#xff01;宝宝&#xff01;&#x1f4a1; ​编辑 如果key值忘记传递了呢&a…

前端后花园周刊vol.18-React Native 称唯一推荐的社区框架是Expo

⚡️行业动态 React Native 团队推荐使用 Expo 框架构建应用程序 React Native 发文称&#xff1a;唯一推荐的社区框架是Expo&#xff0c;Expo 的开发者从 React Native 早期就开始支持 React Native 生态系统&#xff0c;相信 Expo 提供的开发者体验是同类中最好的。 &…

vscode调试教程

VSCode调试 VSCode Debuggers VSCode使用launch.json进行细粒度的控制&#xff0c;可以启动程序或将其附加到复杂的调试场景中 打开Run and Debug视图Ctrl Shift D 点击create a launch.json file&#xff0c;选择C(GDB/LLDB) 会在工作目录自动创建.vscode/launch.json文…

简单的基追踪一维信号降噪方法(MATLAB 2018)

基追踪法是基于冗余过完备字典下的一种信号稀疏表示方法。该方法具有可提高信号的稀疏性、实现阈值降噪和提高时频分辨率等优点。基追踪法采用表示系数的范数作为信号来度量稀疏性&#xff0c;通过最小化l型范数将信号稀疏表示问题定义为一类有约束的极值问题&#xff0c;进而转…

【linux服务器】大语言模型实战教程:LLMS大模型部署到个人服务器或嵌入式开发板(保姆级教学)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 说到大语言模型相信大家都不会陌生&#xff0c;大型语言模型(LLMs)是人工智能文本处理的主要类型,也现在最流行的人工智能…

julia系列17: tsp问题代码整理

1. 常用库和基础函数 这里是优化版的函数&#xff1a; using TSPLIB,LKH,Distances,PyPlot MaxNum 10000 tspreadTSPLIB(:att48) dist [round.(Int,euclidean(tsp.nodes[i,:],tsp.nodes[j,:])) for i in 1:tsp.dimension,j in 1:tsp.dimension]; pos(tsp::TSP,t::Vector{In…

Games101学习笔记 Lecture17 Materials and Appearances

Lecture17 Materials and Appearances 材质 BRDF一、Diffuse/Lambertian Material二、Glossy Material三、Ideal reflective/ refractive Material (BSDF)1.镜面反射2.镜面折射3.菲涅尔项 Fresnel 四、Microfacet BRDF 微表面五、Isotropic / Anisotropic Materials (BRDFs)An…

python - 文件 / 永久存储:pickle / 异常处理

一.文件 利用help(open)可以看到open()函数的定义&#xff1a; >>> help(open) Help on built-in function open in module _io:open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone) 默认打开模式是’rt’&#xff0…

王者荣耀与和平精英的语音识别不准确怎么办?分享一次意想不到的解决经历!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 完整经历 📒🔍 问题初现 🔍🔎 排查之路:从绝望到希望的转折 🔎🎉 顿悟时刻:原来是“她”的恶作剧 🎉⚓️ 相关链接 ⚓️📖 介绍 📖 作为一位打字速度惊人的玩家,我向来自豪于能在王者荣耀和和平精英等游戏…

Three.js机器人与星系动态场景(四):封装Threejs业务组件

实际在写业务的时候不会在每个组件里都写几十行的threejs的初始化工作。我们可以 将通用的threejs的场景、相机、render、轨道控制器等进行统一初始化。同时将非主体的函数提到组件外部&#xff0c;通过import导入进组件。将业务逻辑主体更清晰一些。下面的代码是基于reactthre…

DHCP与TCP的简单解析

目录 一、DHCP 1.1 DHCP概述 1.2 DHCP的优势 1.3 DHCP的模式与分配方式***** 1.3.1 DHCP的模式&#xff1a;C/S模式&#xff08;客户机与服务器模式&#xff09; 1.3.2 DHCP的分配方式 1.4 DHCP的租约过程及原理 1.4.1 DHCP的工作原理***** 1.4.2 更新租约原理***** …

智慧校园-基础平台功能总体概述

智慧校园基础平台是现代教育信息化的核心&#xff0c;它集成了系统管理、基础数据、系统监控、系统工具、流程管理等关键功能&#xff0c;构建了一个全面、智能、安全的校园生态系统。系统管理部分&#xff0c;通过权限管理和用户管理&#xff0c;实现了对用户访问权限的精细化…

使用qt creator配置msvc环境(不需要安装shit一样的宇宙第一IDE vs的哈)

1. 背景 习惯使用Qt编程的童鞋&#xff0c;尤其是linux下开发Qt的童鞋一般都是使用qt creator作为首选IDE的&#xff0c;通常在windows上使用Qt用qt creator作为IDE的话一般编译器有mingw和msvc两种&#xff0c;使用mingw版本和在linux下的方式基本上一样十分简单&#xff0c;不…

warning: GOPATH set to GOROOT (D:\go) has no effect

warning: GOPATH set to GOROOT (D:\go) has no effect gopath 设置一下&#xff0c;并且不要和 goroot 设置成同一个目录

【carla】ubuntu安装carla环境

我们可以通过查看 CARLA 的 GitHub release 页面来找到最新版本的下载链接。 下载 CARLA 压缩包 访问 CARLA Releases 页面&#xff1a; CARLA Releases on GitHub 查找最新版本&#xff1a; 找到最新的版本&#xff0c;点击下载&#xff0c;第一个压缩包 3. 解压 CARLA 包&…

在先企业字号被申请注册成商标!

今天一网友联系普推商标知产老杨&#xff0c;说自己注册的商标被某公司无效宣告了&#xff0c;去年联系老杨时&#xff0c;当时就给说这个商标名称存在风险&#xff0c;与别人的字号权存在高度近似&#xff0c;而且是同行业同地区在后面注册的。 十几年前某公司先成功注册成字号…

AI Agent【项目实战】:MetaGPT遇上元编程,重塑复杂多智能体协作的边界

AI Agent【项目实战】&#xff1a;MetaGPT遇上元编程&#xff0c;重塑复杂多智能体协作的边界 MetaGPT 以一条需求作为输入&#xff0c;并输出用户故事/竞争分析/需求/数据结构/API/文档等。内部而言&#xff0c;MetaGPT 包含产品经理/架构师/项目经理/工程师等角色。它为软件…

树目标、抓过程、要结果

一个好的管理理念不会因为一两个成功案例而发扬&#xff0c;一定是有无数个案例验证了它的价值所在&#xff0c;既然OKR在国外已经取得成功&#xff0c;那么国内依然如此。那么OKR这么成功&#xff0c;它到底好在哪呢&#xff1f; 一、OKR是连接企业战略和落地执行的最佳方式。…

ftp服务

1.什么是FTP FTP&#xff08;文件传输协议&#xff09;是典型的C/S架构的应用层协议&#xff0c;需要由服务端软件、客户端软件两个部分共同实现文件传输功能。FTP客户端和服务器之间的连接是可靠的&#xff0c;面向连接的&#xff0c;为数据的传输提供了可靠的保证。tcp协议&a…