类和对象——(2)类

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

一起加油!

目录

一、引言:

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

三、类的定义: 

例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.rhkb.cn/news/204680.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABAP算法 模拟退火

模拟退火算法 算法原理及概念本文仅结合实现过程做简述 模拟退火算法是一种解决优化问题的算法。通过模拟固体退火过程中的原子热运动来寻找全局最优解。在求解复杂问题时&#xff0c;模拟退火算法可以跳出局部最优解获取全局最优解。 模拟退火算法包含退火过程和Metropolis算法…

AI模型训练——入门篇(二)

导语&#xff1a;本文主要介绍了基于BERT的文本分类方法&#xff0c;通过使用huggingface的transformers库实现自定义模型和任务。具体步骤包括&#xff1a;使用load_dataset函数加载数据集&#xff0c;并应用自定义的分词器&#xff1b;使用map函数将自定义分词器应用于数据集…

数组中的第 K 个最大元素(C++实现)

数组中的第 K 个最大元素 题目思路代码 题目 数组中的第 K 个最大元素 思路 通过使用优先队列&#xff08;最大堆&#xff09;来找到数组中第k大的元素。通过弹出最大堆中的前k-1个元素&#xff0c;留下堆中的顶部元素作为结果返回。 代码 class Solution { public:int find…

Day41 使用listwidget制作简易图片播放器

1.简介 使用QlistWidget实现简易图片播放器&#xff0c;可以打开一个图片序列&#xff0c;通过item的单击事件实现图片的切换&#xff0c;通过设置list的各种属性实现图片预览的显示&#xff0c;美化滚动条即可实现一个简易图片播放器。 2.效果 3.实现步骤&#xff1a; 1.初始…

QT linux下应用程序打包

一、应用程序app 1、应用程序的pro文件 2、 程序工作函数 3、app的UI界面 二、动态库lib 1、Lib类头文件 2、.cpp文件 三、对应用程序和动态库进行构建 1、对动态库进行qmake,然后进行构建 2、对应用程序进行qmake&#xff0c;然后进行构建 3、查看构建目录 四、编写脚本 …

postgreSQL如何快速查询大表数据量

文章目录 场景方案结果 场景 我有一个非常大的表&#xff0c;估计几百万或者几千万。 我开始使用了 select count(*) from my_table_javapub 方式&#xff0c;查询非常慢。 如何解决&#xff1f;&#xff1f;&#xff1f; 方案 如果你需要更快地获取表中的行数&#xff0c…

【PHP】MySQL简介与MySQLi函数(含PHP与MySQL交互)

文章目录 一、MySQL简介二、MySQLi函数1. 开启mysqli扩展&#xff1a;2. PHP MySQLi扩展的常用函数 三、PHP与MySQL交互0. 准备1. 创建连接&#xff08;mysqli_connect() &#xff09;连接mysql语法 2. 选择数据库&#xff08;mysqli_select_db()&#xff09;3. 在php中操作数据…

如果每天工资按代码行数来算,来看看你每天工资是多少

说在前面 &#x1f63c;&#x1f63c;如果每天的工资取决于我们所编写的代码行数&#xff0c;那么我们的生活会发生怎样的改变&#xff1f;来看看你的同事们今天都提交了多少代码吧&#xff0c;看看谁是卷王&#xff0c;谁在摸鱼&#xff08;&#x1f436;&#x1f436;狗头保命…

HTML新手入门笔记整理:HTML基本介绍

网页 静态页面 仅可供用户浏览&#xff0c;不具备与服务器交互的功能。 动态页面 可供用户浏览&#xff0c;具备与服务器交互的功能。 HTML HTML&#xff0c;全称HyperText Markup Language&#xff08;超文本标记语言&#xff09;,是一种用于创建网页的标准标记语言。用于…

如何应对雨天飞行的挑战?无人机机库防护能力解析

一、 背景介绍 无人机机库是无人机停放和起降场所&#xff0c;类似传统飞机的 hangar&#xff08;飞机库&#xff09;。它是一个专门用于存储、维护和保护无人机的设施。无人机机库的存在有助于提高无人机的安全性&#xff0c;同时也为无人机提供了一个有序的管理场所。 雨天…

c语言-希尔排序

目录 一、插入排序 1、插入排序的概念 2、插入排序的逻辑实现 3、插入排序的实现 二、希尔排序 1、希尔排序概念 2、希尔排序逻辑实现 3、间隔值&#xff08;gap&#xff09;对排序的影响 4、希尔排序的实现 三、插入排序与希尔排序性能对比测试 结语&#xff1a; 前言…

2021年12月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共15题,每题2分,共30分) 第1题 下图两个积木的值分别是? A:false true B:false false C:true true D:true false 答案:A 第2题 小猫和小狗是非常好的朋友,他们发明了一种加密方法:用两位数字代表字母。…

进程和线程的关系

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 进程&线程 1. 什么是进程PCB 2. 什么是…

【设计模式-2.2】创建型——简单工厂和工厂模式

说明&#xff1a;本文介绍设计模式中&#xff0c;创建型设计模式中的工厂模式&#xff1b; 飞机大战 创建型设计模式&#xff0c;关注于对象的创建&#xff0c;本文介绍的简单工厂和工厂模式同样也是。举一个游戏例子&#xff0c;如飞机大战游戏中&#xff0c;屏幕中敌人类型…

优维低代码实践:搜索功能

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

每日一练:约瑟夫生者死者小游戏

1. 问题描述 约瑟夫问题&#xff08;Josephus problem&#xff09;是一个经典的数学和计算机科学问题&#xff0c;源于犹太历史学家弗拉维奥约瑟夫斯&#xff08;Flavius Josephus&#xff09;的著作《犹太战记》。问题的描述如下&#xff1a;   在这个问题中&#xff0c;有n…

uniapp微信小程序中阻止事件冒泡

开发场景&#xff1a;列表中展示地块的数据信息&#xff0c;用户可以点击列表进入地块的详情界面&#xff0c;也可以点击列表中的星星按钮进行收藏 遇到的问题&#xff1a;每次点击星星的时候&#xff0c;都会触发父级的点击事件&#xff0c;从而进入到详情界面 原本的代码&am…

android开发:安卓13Wifi和热点查看与设置功能

近日对安卓热点功能做了一些技术验证&#xff0c;目的是想利用手机开热点给设备做初始化&#xff0c;用的是安卓13&#xff0c;简言之&#xff1a; 热点设置功能不可用&#xff0c;不可设置SSID和密码&#xff0c;不可程序控制开启关闭&#xff0c;网上的代码统统都过时了Loca…

【数据结构】树与二叉树(廿五):树搜索给定结点的父亲(算法FindFather)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子、大兄弟结点2. 搜索给定结点的父亲a. 算法FindFatherb. 算法解析c. 代码实现 3. 代码整合 5.3.1 树的存储结构 5. 左儿子右兄弟链接结构 【数据结构】树与二叉树&#xff08;十九&…

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO 概述 上节 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 讲述了如何通过网页控制一个 GPIO。本节实现在网页上控制多个 GPIO。 示例解析 前端设计 前端代码建立了四个 GPIO&#xff0c;如下死 GPIO 2 在前端的…