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


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

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

相关文章

Atlas 200 DK开发者套件的网络连接

一、参考资料 Atlas 200 DK官方文档 二、常用操作 1. Micro SD制卡 在windows系统上&#xff0c;一键制卡的步骤与Atlas 200I DK类似&#xff0c;但步骤更简单&#xff0c;详细步骤请参考&#xff1a;Windows系统制卡 2. Atlas 200 DK与PC机通信 2.1 准备工作 准备一根安…

一些好玩的东西

这里写目录标题 递归1.递归打印数组和链表?代码实现原理讲解二叉树的 前 中 后 序位置 参考文章 递归 1.递归打印数组和链表? 平常我们打印数组和链表都是 迭代 就好了今天学到一个新思路–>不仅可以轻松正着打印数组和链表 , 还能轻松倒着打印(用的是二叉树的前中后序遍…

vue事件代理

数据代理 Object.defineProperty 常见属性值 get和set函数 理解数据代理 Vue中的数据代理 Vue中的数据代理小结 事件处理 v-bind 事件处理小结 数据代理 Object.defineProperty 常见属性值 <body> <script type"text/javascript"> let person{n…

C++:逻辑运算符-非与或(19)

!非!a如果a为假&#xff0c;那么当前他就是真&#xff0c;如果a是真&#xff0c;那么他直接就是假&&与a&&ba与b都为真&#xff0c;那么就是真&#xff0c;如果两个里面有一个为假那么就是假||或a||ba或b有一个为真&#xff0c;那么就是真 非&#xff08;!&…

(学习日记)2024.03.31:UCOSIII第二十八节:消息队列常用函数

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Golang并发模型-Pipeline模型、Fan-in Fan-out模型

这段时间由于项目的需要&#xff0c;本人正在研究关于如何优雅的进行go的并发&#xff0c;以下是结合资料和视频的结果&#xff0c;文末会给出参考资料 Go语言的并发模型主要通过goroutine和channel实现&#xff0c;通过这个我们可以更有效地使用IO和CPU 这里我们围绕生成一个…

LRU的原理与实现(java)

介绍 LRU的英文全称为Least Recently Used&#xff0c;即最近最少使用。它是一种内存数据淘汰算法&#xff0c;当添加想要添加数据而内存不足时&#xff0c;它会优先将最近一段时间内使用最少的数据淘汰掉&#xff0c;再将数据添加进来。 原理 LRU的原理在介绍中就已经基本说…

linux基础篇:Linux操作系统vi编辑器讲解与常用操作

Linux操作系统vi编辑器讲解与常用操作 一、vi编辑器介绍 vi编辑器是一款功能强大的文本编辑器&#xff0c;广泛应用于Unix和类Unix系统。它是由Bill Joy在1976年开发的&#xff0c;后来演变成vim&#xff08;vi improved&#xff0c;即“改进版的vi”&#xff09;编辑器。vi编…

敏感信息泄露漏洞

法律声明 参与培训需要遵守国家法律法规&#xff0c;相关知识只做技术研究&#xff0c;请勿用于违法用途&#xff0c;造成任何后果自负与本人无关。 中华人民共和国网络安全法&#xff08;2017年6月1日起施行&#xff09; 第二十二条 任何个人和组织不得从事入侵他人网络、干扰…

【JAVASE】带你了解面向对象三大特性之一(继承)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 1.继承 1.1 为什么需要继承 Java 中使用类对现实世界中实体来…

ubuntu-server部署hive-part2-安装hadoop

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 安装hadoop ​​​​​​下载上传 下载地址 https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/ 以root用…

JDK 17 新特性实战,答案整理,最新面试题

JDK 17中的Pattern类增强了哪些功能&#xff1f; 1、新增asMatchPredicate方法&#xff1a; JDK 17的Pattern类新增了asMatchPredicate方法&#xff0c;可以将正则表达式编译为Predicate&#xff0c;方便用于过滤集合中的字符串。 2、增强了Unicode属性支持&#xff1a; JDK …

LLM推理参数(top_k,top_p, temperature, num_beams)

正常LLM做 next token predicate 时&#xff0c;对输出的 logits 做 softmax&#xff0c;选择概率最大的token。 num_beams &#xff1a;当我们设置 num_beams2 后&#xff0c;就使用了 beam search 的方法&#xff0c;每次不是只直接选择概率最大的 token&#xff0c;而是保留…

0基础确定要?进入it行业?

0基础如何进入IT行业&#xff1f; &#x1f31f;想进入IT行业&#xff1f;以下是一些对于0基础的人来说可行的步骤和建议&#xff01;&#x1f31f; "IT"是信息技术(Information Technology)的缩写&#xff0c;它指的是使用计算机、网络、软件和其他设备或系统来存…

数据安全之认识数据库审计系统

随着企业业务数据量的不断增长和数据存储的集中化&#xff0c;数据库成为企业的核心资产之一。然而&#xff0c;数据库面临着各种安全威胁&#xff0c;如SQL注入、权限滥用、数据泄露等。为了保障数据库的安全性和完整性&#xff0c;企业需要采取有效的审计措施来监控和记录数据…

spring源码解析-默认标签解析

spring 默认标签解析 parseDefaultElement处理流程 processBeanDefinition方法解析 processBeanDefinition时序图 元素解析 parseBeanDefinitionElement parseBeanDefinitionElement方法核心源码解析 创建GenericBeanDefinition实例对象 parseMetaElements parseConstructorAr…

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

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

通义灵码-ai编码

https://developer.aliyun.com/topic/lingma/activities/202403?taskCode14508&recordIdb1ef3ba27250a5818b1b6ffe418af658#/?utm_contentm_fission_1 「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」

使用向量检索和rerank 在RAG数据集上实验评估hit_rate和mrr

文章目录 背景简介代码实现自定义检索器向量检索实验向量检索和rerank 实验 代码开源 背景 在前面部分 大模型生成RAG评估数据集并计算hit_rate 和 mrr 介绍了使用大模型生成RAG评估数据集与评估&#xff1b; 在 上文 使用到了BM25 关键词检索器。接下来&#xff0c;想利用向…

蓝桥杯 十一届C++A组 字符排序 21分(运行超时)

思路&#xff1a; 1. 此题考查的冒泡排序中的交换次数&#xff0c;其实就是考察当前数与后面的逆序对个数问题。而为了最大利用位数&#xff0c;应当使每一位都不小于后面的字符&#xff0c;否则会造成一次逆序对的浪费&#xff08;贪心&#xff0c;为了使总位数最少&#xff…