C++从入门到精通——类的定义及类的访问限定符和封装

类的定义及类的访问限定符和封装

  • 前言
  • 一、类的定义
    • 类的两种定义方式
    • 成员变量命名规则的建议
    • 示例
  • 二、类的访问限定符和封装
    • 访问限定符
      • 访问限定符说明
      • C++为什么要出现访问限定符
      • 例题
    • 封装
      • 例题


前言

类的定义是面向对象编程中的基本概念,它描述了一类具有相同属性和方法的对象的抽象模板。类定义了对象的结构和行为,包括数据成员(属性)和成员函数(方法)。通过类,可以创建多个具有相同属性和方法的对象实例,从而实现代码的复用和模块化。类的定义通常包括类名、数据成员和成员函数的声明,以及可能的访问控制修饰符来指定成员的访问权限。

访问限定符用于控制类成员的访问权限,如private、protected和public等,它们决定了哪些代码可以访问类的属性和方法。封装则是将类的属性和方法隐藏在其内部,只通过公共接口与外部交互,从而保护数据不被外部直接访问和修改,提高代码的安全性和可维护性。通过访问限定符和封装,可以实现更好的代码封装和信息隐藏,提高程序的模块化和可重用性。


一、类的定义

类的定义是面向对象编程的基础,它描述了具有相同属性和行为的对象的抽象模板。在类中,我们可以定义数据成员(属性)和成员函数(方法),这些成员共同构成了类的状态和行为。

class className
{// 类体:由成员函数和成员变量组成};  // 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。

类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

类的两种定义方式

  1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
    在这里插入图片描述
  2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
    在这里插入图片描述

一般情况下,更期望采用第二种方式。

成员变量命名规则的建议

成员变量的命名应遵循以下建议:

  1. 使用有意义的名称:变量名应该能够清晰地描述其含义和用途。应该避免使用无意义的单词或缩写,以免给其他开发人员带来困惑。

  2. 使用驼峰命名法:变量名应使用驼峰命名法,即第一个单词的首字母小写,后续单词的首字母大写。例如,firstNamelastName

  3. 避免使用缩写:除非广为人知并且相对简洁,否则应尽量避免使用缩写。使用完整的单词可以增加代码的可读性。

  4. 使用具体的名称:变量名应该直观地反映该变量所表示的内容。例如,使用customerName而不是name来表示客户的姓名。

  5. 遵循命名约定:在开发团队中,应统一遵循一套命名约定。例如,使用下划线作为私有变量的前缀,或者使用前缀或后缀来区分变量的类型(如strName表示字符串类型的变量)。

  6. 避免使用保留字:变量名不能与编程语言中的保留字冲突。在选择变量名时,应避免使用关键字和内置函数的名称。

  7. 使用英文:英文是编程界的通用语言,应尽量使用英文来命名变量,以便其他开发人员可以更容易地理解代码。

最重要的是,变量的命名应该具有一致性和可读性,并且能够准确地反映其含义和用途。这有助于提高代码的可维护性和可理解性。

示例

class Date
{
public:void Init(int year){// 这里的year到底是成员变量,还是函数形参?year = year;}
private:int year;
};//使用这种函数进行初始化,初始化是不会成功的,是因为局部优先
// 所以一般都建议这样
class Date
{
public:void Init(int year){_year = year;}
private:int _year;
};
// 或者这样
class Date
{
public:void Init(int year){year_ = year;}
private:int year_;
};
// 或者这样
class Date
{
public:void Init(int year){mYear = year;}
private:int mYear;
};
// 其他方式也可以的,主要看你未来公司要求。一般都是加个前缀或者后缀标识区分就行。

二、类的访问限定符和封装

访问限定符

C++中有三种访问限定符,分别是publicprotectedprivate。这些访问限定符用于控制类的成员的访问权限。

  1. public:公共访问限定符,被声明为public的成员可以在类的内部和外部被访问到。这意味着可以在任何地方访问该成员。

  2. protected:保护访问限定符,被声明为protected的成员可以在类的内部被访问到,但不能在类的外部被直接访问。但是,它可以被继承该类的派生类访问。

  3. private:私有访问限定符,被声明为private的成员只能在类的内部被访问到,不能在类的外部和派生类中被直接访问。

访问限定符的默认访问级别取决于类的声明:

  • 默认情况下,类的成员(包括变量和函数)的访问级别为private
  • 默认情况下,结构体的成员(包括变量和函数)的访问级别为public

例如,下面是一个使用访问限定符的类的示例:

class MyClass {
public:int publicVar;   // 可以在类的内部和外部访问到
protected:int protectedVar;   // 可以在类的内部访问到,派生类也可以访问到
private:int privateVar;   // 只能在类的内部访问到
};

注意,访问限定符的目的是为了控制类的成员的访问权限,以保护数据的完整性和安全性,并且提供封装性。

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
在这里插入图片描述

访问限定符说明

  1. public修饰的成员在类外可以直接被访问
  2. protectedprivate修饰的成员在类外不能直接被访问(此处protectedprivate是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为privatestructpublic(因为struct要兼容C)

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

C++为什么要出现访问限定符

C++出现访问限定符是为了加强对类成员的访问控制,从而提高程序的安全性和可维护性。访问限定符可以限制外部的访问权限,防止无关的代码对类成员进行直接访问和修改,从而避免了意外的错误和数据不一致性。假如没有访问限定符可能会出现下面的场景,因为世界上的人口千千万,你制定了一个规则,不可能所有的人都会根据你所制定的规则去执行,总是会有一些特立独行的人,这时候就需要你用严厉的手段去强迫哪些人去执行你的规则。

在这里插入图片描述

访问限定符包括publicprivateprotected三种,分别用于指定成员的访问权限。public成员可以被类外部的代码访问,private成员只能在类内部的成员函数中访问,protected成员可以在类内部的成员函数和其子类中访问。通过使用这些访问限定符,可以明确规定哪些成员是对外公开的,哪些是内部实现细节,从而提高了程序的模块化和封装性。

访问限定符还可以用于实现类的封装,隐藏类的内部实现细节,只暴露必要的接口给外部使用。这样可以有效地保护类的数据和实现细节,防止外部代码的错误操作和非法访问。

另外,访问限定符也对继承关系起到了重要的作用。子类继承了父类的成员,但是访问限定符可以控制子类对父类成员的访问权限。这样可以在保持继承关系的同时,限制对继承成员的访问范围,提高了程序的灵活性和安全性。

总之,C++出现访问限定符是为了提高程序的安全性、可维护性和灵活性,通过明确规定成员的访问权限,实现对类成员的访问控制和类的封装。

例题

C++中structclass的区别是什么?

解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是publicclass定义的类默认访问权限是private。注意:在继承和模板参数列表位置,structclass也有区别,后序文章给大家介绍。

封装

面向对象的三大特性:封装、继承、多态。

C++的封装是一种面向对象的编程特性,它允许将数据和对数据的操作封装在一个类中,使得数据和操作与外部代码隔离,并提供了访问和修改数据的接口。

C++的封装通过类的访问修饰符来实现。一个类可以包含公有、私有和保护三种类型的成员,其中公有成员可以被类的外部代码直接访问,私有成员只能在类的内部访问,而保护成员则只能在类的内部和其派生类中访问。

封装的优点包括:

  • 数据隐藏:通过将数据封装在类的私有成员中,可以避免外部代码直接修改数据,从而提高代码的安全性和可靠性。
  • 细节隐藏:封装可以隐藏类的实现细节,使得外部代码只需要关注类的公有接口,而不需要了解类的内部实现。
  • 代码重用:通过封装类的功能和数据,可以将类作为一个独立的模块,从而提高代码的可重用性。

以下是一个使用封装的示例:

class Rectangle {
private://私有int width;int height;public://公有void setWidth(int w) {if (w > 0) {width = w;}}void setHeight(int h) {if (h > 0) {height = h;}}int getWidth() {return width;}int getHeight() {return height;}int getArea() {return width * height;}
};int main() {Rectangle rect;rect.setWidth(5);rect.setHeight(3);int area = rect.getArea();cout << "Area: " << area << endl;return 0;
}

在上面的示例中,Rectangle类封装了宽度和高度两个私有成员变量,以及设置和获取这两个成员变量的公有成员函数。外部代码通过这些公有成员函数来访问和修改类的数据。

例题

在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。

封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

在这里插入图片描述
在这里插入图片描述
对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。

在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。


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

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

相关文章

MyBatis-Plus的学习笔记

MyBatis-Plus 一、MyBatis-Plus快速入门 1.1 简介 课程版本&#xff1a;3.5.3.1 https://baomidou.com/ MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&…

基于Vision Transformer的迁移学习在乳腺X光图像分类中的应用

乳房X线摄影(MG)在乳腺癌的早期发现中起着重要作用。MG可以在早期阶段发现乳腺癌&#xff0c;即使是感觉不到肿块的小肿瘤。基于卷积神经网络(CNN)的DL最近吸引了MG的大量关注&#xff0c;因为它有助于克服CAD系统的限制(假阳性、不必要的辐射暴露、无意义的活组织检查、高回调…

51单片机入门_江协科技_21.1_开发板USB口连接建议

1. 目前我自己用的普中A2版本的开发板&#xff0c;操作失误导致在开发板连接电脑并通电的情况下误将跳线帽触碰到开发板的3.3V与GND&#xff0c;导致USB口浪涌&#xff0c;2个电脑上面的USB口烧毁&#xff0c;开发板暂时没有任何问题&#xff0c;电脑USB口现在只是接通后有电&a…

8_springboot_shiro_jwt_多端认证鉴权_多Reaml管理

1. 目标 前面一直讨论的是只有一个Reaml的场景&#xff0c;Shiro是可以管理多个Realm的。那么什么场景下&#xff0c;我们需要定义多个Realm&#xff0c;以及Shiro框架是如何管理多个Realm的&#xff0c;他们是如何工作的。本章将会解释上面的问题&#xff0c;最后会配置前面章…

基于python爬虫与数据分析系统设计

**单片机设计介绍&#xff0c;基于python爬虫与数据分析系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于Python爬虫与数据分析系统的设计是一个结合了网络数据抓取、清洗、存储和数据分析的综合项目。这样的系统通常…

jenkins+docker实现可持续自动化部署springboot项目

目录 一、前言 二、微服务带来的挑战 2.1 微服务有哪些问题 2.2 微服务给运维带来的挑战 三、可持续集成与交付概述 3.1 可持续集成与交付概念 3.1.1 持续集成 3.1.2 持续交付 3.1.3 可持续集成与交付核心理念 3.2 可持续集成优点 3.3 微服务为什么需要可持续集成 四…

Java栈和队列的实现

目录 一.栈(Stack) 1.1栈的概念 1.2栈的实现及模拟 二.队列(Queue) 2.1队列的概念 2.2队列的实现及模拟 2.3循环队列 2.4双端队列&#xff08;Deque&#xff09; 一.栈(Stack) 1.1栈的概念 栈:一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作…

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于CPO-GPR基于冠豪猪算法优化高斯…

顺序表相关习题

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…

平衡二叉树,红黑树,B树和B+树的区别及其应用场景

平衡二叉树 基础数据结构左右平衡高度差大于1会自旋每个节点记录一个数据 平衡二叉树&#xff08;AVL&#xff09; AVL树全称G.M. Adelson-Velsky和E.M. Landis&#xff0c;这是两个人的人名。 平衡二叉树也叫平衡二叉搜索树&#xff08;Self-balancing binary search tree…

58 vue-cli 以及 webpack 提供的默认的插件, 配置

前言 vue-cli 这边作为驱动 webpack 的一个应用 它需要构造 webpack 所需要的上下文, 以及参数 这里 我们来关注一下 vue-cli 这边为 webpack 构造的参数 的相关处理 webpack 这边上下文的配置, 主要分为了几个部分, Entry, Output, Module, Resolve, Plugin, DevServer, O…

入门MyBatis

文章目录 入门MyBatisMyBatis快速入门创建user表添加数据创建模块导入坐标编写Mybatis核心配置文件编写SQL映射文件编码 使用idea编写sql代码链接数据库调出console控制台 Mapper代理开发定义与SQL映射文件同名的Mapper接口编码 MyBatis核心配置文件安装mybatisx插件配置文件完…

9(10)-1(2)-CSS 布局模型+CSS 浮动

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 一、CSS 布局模型1 流动模型&#xff08;标准流&#xff09; 二、CSS 浮动1 浮…

HTTP详解及代码实现

HTTP详解及代码实现 HTTP超文本传输协议 URL简述状态码常见的状态码 请求方法请求报文响应报文HTTP常见的HeaderHTTP服务器代码 HTTP HTTP的也称为超文本传输协议。解释HTTP我们可以将其分为三个部分来解释&#xff1a;超文本&#xff0c;传输&#xff0c;协议。 超文本 加粗样…

k8s存储卷 PV与PVC 理论学习

介绍 存储的管理是一个与计算实例的管理完全不同的问题。PersistentVolume 子系统为用户和管理员提供了一组 API&#xff0c;将存储如何制备的细节从其如何被使用中抽象出来。为了实现这点&#xff0c;我们引入了两个新的 API 资源&#xff1a;PersistentVolume 和 Persistent…

Java集合——Map、Set和List总结

文章目录 一、Collection二、Map、Set、List的不同三、List1、ArrayList2、LinkedList 四、Map1、HashMap2、LinkedHashMap3、TreeMap 五、Set 一、Collection Collection 的常用方法 public boolean add(E e)&#xff1a;把给定的对象添加到当前集合中 。public void clear(…

用C/C++加Easyx实现俄罗斯方块游戏(爆肝4万字,完全免费)

前言 相信大家一定玩过俄罗斯方块这款小游戏&#xff0c;简单容易上手是老少皆宜的小游戏&#xff0c;今天大家就跟着我来实现这个小游戏吧&#xff01;让自己学的C语言有用武之地。 为了让俄罗斯方块的开发更为简单些&#xff0c;图像更为丰富&#xff0c;在这里就利用了Easyx…

LOOP循环

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 循环语句和条件语句一样都可以控制程序的执行顺序&#xff0c;而循环语句是指一段程序可以重复执行&#xff0c;PL/SQL 语言主要支持 3 种类型的循环&#xff1a;LOOP 循环、…

最优乘车

题目描述 H 城是一个旅游胜地&#xff0c;每年都有成千上万的人前来观光。为方便游客&#xff0c;巴士公司在各个旅游景点及宾馆&#xff0c;饭店等地都设置了巴士站并开通了一些单程巴上线路。每条单程巴士线路从某个巴士站出发&#xff0c;依次途经若干个巴士站&#xff0c;…

42. 接雨水(Java)

目录 题目描述:输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a; height [0,1,0,2,1,0,1,3,2,1,2,1]输出&#xff1…