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

2024-04-06 23:20

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


这篇关于C++从入门到精通——类的定义及类的访问限定符和封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881095

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多