类和对象——(2)类

news2024/11/17 17:43:57

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
     只虽然夜晚很长,但天一定会亮!

一起加油!

目录

一、引言:

二、类是一种用户自己定义的数据类型: 

三、类的定义: 

例1:用 C++定义一个包含函数的结构体类型,该类型可存放学生信息。

 说明:

说明: 

四、类中成员的访问权限控制: 

说明:

五、类的成员函数:

1.成员函数的定义:         

2.成员函数的重载:

3.带默认形参值的成员函数 :

 六、总结:

七、共勉:


一、引言:

        在上篇文章中我们介绍了如何使用 C++标准库中预定义的 string 类来完成字符的输入/输出操作。C++库中预定义的类,可以帮助我们解决一些问题。但是更多的时候我们需要定义特定的类以解决特定的问题。接下来将介绍如何在 C++中创建一个类。

二、类是一种用户自己定义的数据类型: 

        数据类型是对系统中所有要处理的变量的归类,变量是数据类型的一个实例 (Instance)。每个变量都有他们的属性:内容、空间地址等;各个变量都有他们的操作:算数运算或逻辑运算等。类与对象的关系就如同数据类型与变量的关系。因此,类的本质是一种自定义的数据类型。声明这种复杂的数据类型后,就可以通过这种数据类型定义相应的变量一一对象 。

三、类的定义: 

        C++中的结构对 C 语言的结构类型进行了扩充,除了包含属性C++中的结构还可以包含函数。 

例1:用 C++定义一个包含函数的结构体类型,该类型可存放学生信息。

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

struct Student{
	int ID;
	string name;
	string sex;
	int age;
	void print(){
		cout<<"ID:"<<ID<<"\nName:"<<name<<"\nsex:"<<sex<<"\nage:"<<age<<endl;
	}
};

int main(){
	Student stu;
	stu.ID=20230011;
	stu.name="张三";
	stu.sex="男"; 
	stu.age=18;
	stu.print();
	return 0;
}

 说明:

        在结构体类型声明之外定义结构体变量后,每个结构体变量中都拥有一个成员复制空间,结构体变量 stu 中包含成员空间ID、name、sex 和age,在结构体外可以通过结构体变量stu 访问ID、name、sex 和age等成员空间。

        为了区分传统意义上的不包含方法的结构体类型,C++中使用 class 表示类。类与结构体一样是一种用户自定义的数据类型,包含属性和行为两个部分。
        类是对同类对象的抽象表述,在定义类之前,需要对系统中同类对象进行分析,找出它们共同的属性和行为,属性用数据表示,行为用函数表示。其中,属性是类的数据成员,行为则是类的成员函数,它们都是类的成员。
        在默认情况下,类中所有的成员都是封装起来的,即在类的外部不能通过类定义的对象来访问它们。对类进行封装可以对数据起到很好的保护作用。但如果所有的都是默认封装起来,外部不能访问,类就失去了使用价值,如下所示的 Student 类: 

#include<iostream>
#include<string>
using namespace std;
class{
	int ID;
	string name;
	string sex;
	int age;
	void print(){
		cout<<"ID:"<<ID<<"\nName:"<<name<<"\nSex:"<<sex<<"\nAge:"<<age<<endl;
	}
	void initialdate(){
		ID=pid;
		name=pname;
		sex=psex;
		age=page;
	}
};

         在默认情况下,用户不能直接访问类中成员外部,Student 类在外部几乎无法正常使用,因此在定义类时可以根据需要设定一些成员受保护,使得外部不能被直接访问,另一些成员外部可以被直接访问。
        类定义一般包括类的原型说明和类的实现部分两部分。说明部分说明类有哪些成员,实现部分则是对成员函数的定义。
        类的定义的一般格式如下:

class <类名>
{
	public:
		外部接口<类中公有成员>
	private:
		<类中私有成员>
	protected:
		<类中保护型成员> 
}; 

        其中,class 是定义类的关键字,<类名>是用户自定义的标识符,花括号内是类的声明部分,说明该类具有哪些数据成员和函数成员,所有成员默认的访问属性是 private 私有属性,通过关键字 public、private 和 protected 可声明成员不同的访问属性。
        继续以 student类为例,一般我们将可以提供给外部操作的函数设置为公有的,数据( 即属性)根据需要可以设置为私有的或者受到保护的,如下所示: 

#include<iostream>
#include<string>
using namespace std;
class{
	protected: 
		int ID;
		string name;
	private:
		string sex;
		int age;
	public:
		void print(){
			cout<<"ID:"<<ID<<"\nName:"<<name<<"\nSex:"<<sex<<"\nAge:"<<age<<endl;
		}
		void initialdate(){
			ID=pid;
			name=pname;
			sex=psex;
			age=page;
		}
	};

说明: 

其中的 public、protected 和 private 分别表示对成员的不同访问权限控制 。

类的成员函数可以只在类中声明函数原型,成员函数的具体实现(函数体)可以在类外定义。

四、类中成员的访问权限控制: 

        类中的成员包括数据成员和函数成员,分别描述问题的属性和行为,是不可分割的两个方面。为了理解类成员的访问权限,我们以电子日历类进行说明。电子日历类的定义如下: 

#include<iostream>
#include<string>
using namespace std;
class Calendar{
	public:
		void setY(int newY){
			year=newY;
		}
		void setM(int newM){
			month=newM;
		}
		void setD(int newD){
			day=newD;
		}
		void showDate(){
			cout<<year<<"/"<<month<<"/"<<day<<endl;
		}
	private:
		int year,month,day;
};

        只要是电子日历,都记录日期值,都有显示面板、旋钮或按钮。所以,我们可以将所有的电子日历对象的共性抽象出来,然后用一个类来描述,这里我们用Calendar 类来描述。封闭的外壳可以将电子日历内部机械及电路装置保护起来,一般的使用者只能从面板上查看日期,通过按钮获取语音报日期,或者通过按钮旋钮调整日期。因此,面板、按钮和旋钮就是我们接触和使用的电子日历的方法,一般将其设计为类的外部接口。而电子日历记录的年、月、日就是类的私有成员,使用者只能通过外部接口去访问私有成员。
        通过设置类成员的访问控制属性,就可以实现对类成员的访问权限的控制。访问属性有以下3种:公有类型(public)、私有类型(private) 和保护类型 (protected)。
        公有类型的成员是类的外部接口。公有成员用 public 关键字声明,在类外只能访问类的公有成员。对电子日历类而言,可以通过从外部调用 setY()、setM()、setD()、showDate()这几个公有类型的成员函数改变日期或者查看日期。 

        私有成员用 private 关键字声明,如果私有成员紧接着类名称,可以省略关键字 private。在类的外部访问私有成员是非法的,私有成员只能被本类中的成员函数访问,这样私有成员就被完全隐藏在类的内部,保证了数据的安全,例如,电子日历类中的 year、month、day 都是私有成员。

说明:

        在一般情况下,我们把类的属性即类的数据成员声明为私有的,这样类的内部数据线构就不会对该类以外的其余部分造成影响,程序模块之间的相互影响就会被降低到最小 。

         保护成员和私有成员的性质在类中是相似的一一只能被本类的成员函数访问,不能从类的外部访问;保护成员和私有成员的差别主要体现在继承过程中。

        乍一看,class 似乎可有可无,它几乎只是结构 struct 的一个替代品而已。但 class 在实现数据封装上与 struct 有很大的区别,结构体类型中的所有成员在默认情况下都是公有的,在结构体的外部可以通过结构体变量进行访问;而类需要实现封装和隐藏,因此需要将类中一些重要属性保护起来,所以类里面所有成员默认都是私有的,即只能在类的内部访问,不能从外部直接访问.同时,在类的基础上可以实现继承和多态,这些都是结构体无法完成的。

        在类的定义中,具有不同访问属性的成员,可以按任意顺序出现。修饰访问属性的关键字可以多次出现。

五、类的成员函数:

1.成员函数的定义:         

         类的成员函数描述了类的行为,例如电子日历类中的成员函数 setY( )、setM( )、setD( )和showDate( )。通过公有成员函数可以对封装的私有数据和保护数据进行各种操作。

        同时,我们也可以在类中说明成员函数原型一一函数的参数表、函数的返回值类型,把函数的具体实现即函数体写在类的定义之外。成员函数不是普通的函数,它属于类,因此当把类的成员函数写在类外时,需要在函数名前面加上类名及作用域运算符。其定义格式如下:

返回值类型 类名::成员函数名 (参数表)
{
	函数体
}

        例如,把电子日历中的成员函数定义写在类外,只在类里面给出成员函数原型,如下代码所示: 

#include<iostream>
#include<string>
using namespace std;
class Calendar{
	public:
		void setY(int newY);
		void setM(int newM);
		void setD(int newD);
		void showDate();
	private:
		int year,month,day;
};
void Calendar::setY(int newY){
			year=newY;
		}
void Calendar::setM(int newM){
			month=newM;
		}
void Calendar::setD(int newD){
			day=newD;
		}
void Calendar::showDate(){
			cout<<year<<"/"<<month<<"/"<<day<<endl;
		}

        因此,成员函数的实现有以下两种方法:
        (1) 将成员函数的定义直接放在类里面:
        (2)将成员函数的定义写在类外面,在类中只给出函数的原型声明。
        如果成员函数的实现比较简单,可以把成员函数的定义直接写在类里面,它会自动成为内联成员函数。内联函数 ,在调用函数的时候需要一定的空间和时间资源来传递参数及返回值,记录程序的当前状态,保护程序当前运行现场,以保证函数调用完毕后能够正确地返回并从中断点继续执行。如果某些函数有可能被频繁调用,而且代码比较简单,则可以将这个函数定义为内联函数:与普通的内联函数相同,内联成员函数的函数体也会在编译时被替换到每一个调用它的地方。这种做法可以减少函数调用带来的开销,但是增加了编译后代码的长度。所以一般将只是比较简单的成员函数定义在类里面,使其自动成为内联成员函数。
        如果成员函数实现比较复杂,建议采用第二种方法。
        一般可将类的声明部分放在头文件 (.h)中,向其他开发人员公开,而将类的实现部分放在源程序文件(.cpp)中,便于内部修改与维护,以及对外隐藏技术。

2.成员函数的重载:

         函数重载,在一个类中也可以定义同名的成员函数构成成员函数的重载。成员函数的重载和普通函数没有太大区别,例如,我们可以定义如下代码所示的两个 setM( )函数:

class Calendar{
	public:
		void setM(int newM){
			month=newM;
		}
		void setM(){
			cout<<"Please input month to set the calendar"<<endl;
			cin>>month;
		}
		…… 
};

3.带默认形参值的成员函数 :

         带默认形参值的函数,类的成员函数也可以有默认形参值,其调用规则普通函数一样。类成员函数的默认值一定要写在类定义中,而不能写在类外。成员函数有默认值可以给编程带来便利,如电子日历类中的 setY( )函数,就可以使用默认值,如下所示:

class Calendar{
	public:
		void setY(int newY = 2023);
		…… 
};

        如果调用这个函数时没有给出实参,系统就会按照默认值将年设置为“2023”年。

        如果既有成员函数重载又有带默认形参值的成员函数,两者一起使用不要有重叠的地方,否则编译时,无法确定到底调用那一个函数,编译就会出错 

 六、总结:

        类的本质是一种自定义的数据类型。声明这种复杂的数据类型后,就可以通过这种数据类型定义相应的变量一一对象 。

        类是对同类对象的抽象表述。

        类中的成员包括数据成员和函数成员,分别描述问题的属性和行为,是不可分割的两个方面。

        在一般情况下,我们把类的属性即类的数据成员声明为私有的,这样类的内部数据线构就不会对该类以外的其余部分造成影响,程序模块之间的相互影响就会被降低到最小 。

        在一个类中也可以定义同名的成员函数构成成员函数的重载。

        类的成员函数也可以有默认形参值。

七、共勉:

         以上就是我对类和对象——(2)类的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对类和对象的理解,请持续关注我哦!!! 

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

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

相关文章

鸿蒙4.0开发笔记之ArkTS语法基础@Entry@Component自定义组件的使用(九)

文章目录 一、自定义组件概述1、什么是自定义组件2、自定义组件的优点 二、创建自定义组件1、自定义组件的结构2、自定义组件要点3、成员变量的创建4、参数传递规则 三、练习案例 一、自定义组件概述 1、什么是自定义组件 在ArkUI中&#xff0c;UI显示的内容均为组件&#xf…

CodeTON Round #7 (Div. 1 + Div. 2)

A.jagged Swaps 题意&#xff1a; 给出一个包含 n n n个数字的序列&#xff0c;每次可以选择一个同时大于左右两边相邻的数字&#xff0c;将这个数字与它右边的数字交换&#xff0c;问能否在经过若干次操作后使序列变为升序。 分析&#xff1a; 由于交换只能向后进行&#…

OpenCV | 模版匹配

import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline 模版匹配 模版匹配和卷积原理很像&#xff0c;模版在原图像上从原点开始滑动&#xff0c;计算模版与&#xff08;图像被模版覆盖的地方&#xff…

SAP VL01N Error VL 367

在VL01N 创建交货单的时候&#xff0c;报错&#xff1a;An item with no delivery quantity is not permitted. Item will be deleted. 第一种情况&#xff1a; 1.首先MMBEcheck 可用库存&#xff0c;非限制使用库存是否充足 注意&#xff1a;这里框出来的交货库存也是非限制…

HMM预习中文版

马尔可夫模型 在之前的笔记中&#xff0c;我们讨论了贝叶斯网络&#xff0c;以及它们如何被用于紧凑地表示随机变量之间的关系。现在&#xff0c;我们将介绍一个与之紧密相关的结构&#xff0c;称为马尔可夫模型&#xff0c;对于本课程的目的&#xff0c;可以将其视为类似于链…

位运算算法【1】

文章目录 &#x1f34a;面试题 01.01. 判定字符是否唯一&#x1f96d;题目&#x1f351;算法原理&#x1f95d;解法一&#xff1a;哈希表&#x1f95d;解法二&#xff1a;位图 &#x1f951;代码实现 &#x1f33d;268. 丢失的数字&#x1f96c;题目&#x1f344;算法原理&…

多线程(补充知识)

STL库&#xff0c;智能指针和线程安全 STL中的容器是否是线程安全的? 不是. 原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全,会对性能造成巨大的影响. 而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶). 因此 STL 默认…

(Linux2.6内核)进程调度队列与切换

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 我们首先来了解几个概念 1. 进程在CPU上运行的时候&#xff0c;一定要运行完才行吗&#xff1f;答案是否定的&#xff0c;我们大部分的操作系统&#xff0c;主流就是分时操作系统&#xff0c;即基于时间片进程轮转执行的。 …

吃火锅(Python)

题目描述 吃火锅 以上图片来自微信朋友圈&#xff1a;这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”&#xff0c;那就厉害了&#xff0c;我们的故事就开始了。 本题要求你实现一个程序&#xff0c;自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。…

单片机复位电路

有时候我们的代码会跑飞,这个时候基本上是一切推到重来.”推倒重来”在计算机术语上称为复位.复位需要硬件的支持,复位电路就是在单片机的复位管脚上产生一个信号&#xff0c;俗称复位信号.这个信号需要持续一定的时间,单片机收到该信号之后就会复位,从头执行。 复位原理: 那么…

python基于YOLOv8全系列模型【n/s/m/l/x】开发构建不同参数量级的钢铁产业产品智能自动化检测识别系统

在前文的项目开发实践中&#xff0c;我们已经以钢铁产业产品缺陷检测数据场景为基准&#xff0c;陆续开发构建了多款目标检测模型&#xff0c;感兴趣的话可以自行阅读即可。 《YOLOv3老矣尚能战否&#xff1f;基于YOLOv3开发构建建钢铁产业产品智能自动化检测识别系统&#xf…

人工智能原理复习--知识表示(一)

文章目录 上一篇知识概述命题逻辑谓词逻辑谓词逻辑的应用 下一篇 上一篇 人工智能原理复习–绪论 知识概述 知识就是人类认识自然界的精神产物&#xff0c;是人类进行智能活动的基础。 是经过加工的信息&#xff0c;包括事实、信念和启发式规则。 分类&#xff1a; 按作用可…

第22章 NIO编程

在本章中需要掌握NIO中的缓冲区的作用&#xff0c;并理解缓冲区中的数据处理模型&#xff0c;掌握Channel的作用&#xff0c;并结合缓冲区实现数据I/O操作&#xff0c;理解文件锁的作用&#xff0c;并且掌握字符编码处理支持类的使用&#xff0c;掌握Reactor设计模型&#xff0…

深信服AD负载均衡频繁掉线故障分析

一个由114.114.114.114引起的AD异常 客户反馈深信服负载均衡链路频繁掉线&#xff0c;具体故障现象如下 可以获取到IP地址、网关 两分钟掉一次&#xff0c;持续一个多月&#xff0c;求IT的心理阴影面积&#xff01; 链路监视器只设置了一个114.114.114.114 处理流程&#xff…

Ps:子路径的上下排列以及对齐与分布

不论是一个形状图层&#xff08;或图层的矢量蒙版&#xff09;上的多个形状还是同一路径层上多个路径&#xff0c;只要对应“路径”面板的一个路径层&#xff0c;可以将这些路径称为该路径层的“子路径”&#xff0c;也称为“组件”。 当一个路径层上有两个以上的子路径时&…

『 Linux 』进程优先级

文章目录 什么是优先级Linux下的进程优先级PRI与NI使用top查看进程以及对进程的优先级的修改 进程优先级的其他概念竞争性与独立性并发与并行 什么是优先级 优先级,顾名思义,即在同一环境下不同单位对同一个资源的享有顺序; 一般优先级高的单位将优先占有该资源; 在进程当中进…

SELinux零知识学习三十七、SELinux策略语言之约束(1)

接前一篇文章:SELinux零知识学习三十六、SELinux策略语言之角色和用户(7) 四、SELinux策略语言之约束 SELinux对策略允许的访问提供了更严格的约束机制,不管策略的allow规则如何。 1. 近距离查看访问决定算法 为了理解约束的用途,先来看一下SELinux Linux安全模块(Lin…

chatgpt prompt提示词

ChatGPT 最近十分火爆&#xff0c;今天我也来让 ChatGPT 帮我阅读一下 Vue3 的源代码。 都知道 Vue3 组件有一个 setup函数。那么它内部做了什么呢&#xff0c;今天跟随 ChatGPT 来一探究竟。 实战 1.setup setup 函数在什么位置呢&#xff0c;我们不知道他的实现函数名称&…

PyCharm简介与安装

pyCharm的作用 PyCharm是一种Python的集成开发环境&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高效率的工具 pyCharm的集成 pyCharm的分类 PyCharm的下载 网址&#xff1a;https://www.jetbrains.com/pycharm/download/#sectionwindows PyCharm的安装

Jmeter--如何监控服务器资源

在我们做项目的性能测试时&#xff0c;需要查看相关服务器的资源使用情况&#xff1b;本文以apache-Jmeter-5.5版本为例&#xff0c;使用PerfMon进行服务器资源监控的方案由两部分来实现&#xff1a;ServerAgent部署在被测服务器&#xff0c;负责资源耗用数据的采集&#xff0c…