c++总复习

news/2025/2/11 23:27:05

1. 什么是封装性

封装性(Encapsulation)是面向对象编程(Object-Oriented Programming,OOP)中的一个重要概念,它指的是将数据(通常是类的成员变量)和操作这些数据的方法(类的成员函数)组合在一起,并对外部隐藏数据的具体实现细节,只通过特定的接口(类的公有成员函数)来访问和操作这些数据。简单来说,就像是把相关的东西放在一个 “黑盒子” 里,外部使用者不需要知道里面具体是怎么运作的,只需要按照规定好的方式去使用它就能达成目的。

例如,设计一个表示银行账户的类,账户的余额信息就是内部的数据,而存钱、取钱这些操作就是与之相关的方法。外部用户不需要知道余额具体是怎么在内部存储和计算的,只需要通过提供的存钱、取钱等公有方法就能对账户进行相应操作,这就体现了封装性。

2. C++ 中如何实现封装

在 C++ 中,主要通过类(class)来实现封装,具体有以下几个关键要素:

(1)访问修饰符

C++ 提供了三种访问修饰符:public(公有)、private(私有)和 protected(受保护)。

  • public
    公有成员(包括成员函数和成员变量,不过一般尽量少让成员变量为公有,更多是公有成员函数)可以在类的外部被访问。例如:
class Rectangle {
public:int getWidth() { return width; }int getHeight() { return height; }
private:int width;int height;
};

在上述代码中,getWidth 和 getHeight 这两个公有成员函数可以被类外部的代码调用,用于获取 Rectangle 类中私有成员变量 width 和 height 的值。

  • private
    私有成员只能在类的内部被访问,外部代码无法直接访问私有成员变量或调用私有成员函数。就像上面代码中的 width 和 height,它们被声明为私有,只能通过类内部的公有函数(如 getWidth 和 getHeight)来间接操作它们。这样就把数据隐藏起来了,保证了数据的安全性和封装性。
  • protected
    受保护成员的访问权限介于公有和私有之间,它在类内部可以正常访问,同时在派生类(继承该类的子类)中也能被访问,但在类的外部(非派生类的其他代码处)不能被访问。常用于在继承体系中,让子类可以访问父类的部分成员,同时又对外界保持一定的隐藏性。例如:
class Shape {
protected:int color;
public:void setColor(int c) { color = c; }
};class Circle : public Shape {
public:void changeColor(int newColor) {color = newColor;  // 在派生类中可以访问受保护的成员color}
};
(2)类的定义和使用

定义一个类时,将相关的数据成员声明为合适的访问权限(一般数据成员多为私有或受保护),并提供公有成员函数作为与外部交互的接口。然后在类外部使用对象时,只能通过这些公有接口来操作对象的数据。例如:

class Person {
private:std::string name;int age;
public:Person(const std::string& n, int a) : name(n), age(a) {}void introduce() {std::cout << "My name is " << name << ", and I'm " << age << " years old." << std::endl;}
};int main() {Person p("Alice", 25);p.introduce();  // 通过公有成员函数introduce来展示对象相关信息,不能直接访问私有成员name和agereturn 0;
}

3. 封装性的好处

(1)数据隐藏与安全性

封装把类的内部数据隐藏起来,外部代码不能随意修改,只能通过类提供的合法接口去操作数据。这样可以防止外部代码意外地或者恶意地破坏对象内部数据的完整性和一致性。比如对于一个管理数据库连接的类,内部的连接字符串、用户名、密码等敏感信息设置为私有,外部无法直接访问修改,只有通过类提供的经过安全验证等设计的连接、断开连接等接口去操作,保障了数据安全。

(2)提高代码的可维护性

当类的内部实现需要修改时,只要对外的接口保持不变,那么使用这个类的其他代码(可能在不同的模块甚至不同的项目中)通常不需要做相应改动。例如,一个实现栈数据结构的类,最初内部用数组来存储元素,后面为了提高性能想改成用链表来存储元素,只要 push(入栈)、pop(出栈)等对外的公有接口函数功能和参数不变,使用这个栈类的其他代码就能正常工作,大大降低了代码维护的难度和成本。

(3)便于代码的复用

封装好的类可以方便地在不同的项目或者模块中被复用。因为使用者只需要了解其对外提供的接口功能,不需要关心内部具体实现细节,只要符合使用场景就可以直接拿来使用。比如一个实现了常用数学运算功能(如求最大公因数、最小公倍数等)的类,其他需要进行这些数学运算的程序都可以复用这个类,而不用重新去编写相关的运算代码。

(4)增强代码的模块化

通过封装,不同的类可以看作是不同的模块,每个模块有自己独立的数据和操作这些数据的方法,模块之间通过接口进行交互,这样使得整个程序的结构更加清晰,各个模块的职责明确,易于理解和开发,符合软件工程中模块化开发的理念,提高了大型项目开发的效率和质量。


https://dhexx.cn/news/show-5468800.html

相关文章

Cursor vs VSCode:主要区别与优势分析

Cursor - The AI Code Editor 1. AI 集成能力 Cursor的优势 原生AI集成&#xff1a; # Cursor可以直接通过快捷键调用AI # 例如&#xff1a;按下 Ctrl K 可以直接获取代码建议 def complex_function():# 在这里&#xff0c;你可以直接询问AI如何实现功能# AI会直接在编辑器中…

网络编程(UDP\TCP回显服务器)

目录 套接字socket TCP和UDP特点比较 特点 比较 UDP回显服务器/客户端的编写 UDP的socket api 回显服务器 客户端 TCP回显服务器/客户端的编写 TCP的socket api 回显服务器 客户端 优化服务器 1.关闭服务器创建的socket对象 2.引入线程池&#xff0c;为多个客户…

大语言模型应用Text2SQL本地部署实践初探

自从两年前OpenAI公司发布ChatGPT后&#xff0c;大模型(Large Language Model&#xff0c;简称LLM)相关技术在国内外可谓百家争鸣&#xff0c;遍地开花&#xff0c;在传统数据挖掘、机器学习和深度学习的基础上&#xff0c;正式宣告进入快速发展的人工智能(Artificial Intellig…

pushgateway HA高可用方案

未经本人同意不得转载&#xff0c;若引用请附上原文链接。 项目使用flink来处理kafka中的无界流数据&#xff0c;采用的是flink on yarn的模式部署flink任务。最近做flink任务的监控过程中&#xff0c;踩了一些坑。下面是过程&#xff0c;只想看最终方案的直接拉到最后。 先说…

云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)

计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09;1.2 cpu虚拟化1.3 内存虚拟化1.4 IO虚拟化1.5 常见的集群的策略1.6 华为FC 1.计算虚拟化介绍 1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#…

切尔诺夫界:概率界限的精确利器

切尔诺夫界&#xff1a;概率界限的精确利器 背景 在概率论中&#xff0c;切尔诺夫界&#xff08;Chernoff Bound&#xff09; 是一种强大的工具&#xff0c;它通过引入指数函数&#xff0c;能够为随机变量的大偏差概率提供更加精确的界限。相比于马尔科夫不等式和切比雪夫不等…

TCP Robot Send Recive

Function main String data$ 定义字符串变量 SetNet #205, "192.168.0.1", 2004, CRLF, NONE, 0 设置端口号IP地址 OpenNet #205 As Server 端口号对应pc机的端口号 Print "等待201端口连接" WaitNet #201 等待201网…

vue2:父组件中的数组没有响应子组件中的slice操作

需求 主页面上有一个模块列表,通过列表下方的“维护”按钮,可弹出一个对话框,供用户添加、删除、编辑模块信息。 实现 具体实现时,直接将主页面的模块列表数组moduleOptions作为prop传递给子组件对话框 //子组件 props: [moduleOptions,projectFrm],//父组件 <proje…

【大模型微调】pdf转markdown

目前市面上大部分都是pdf文档,要想转换成能训练的文本,调研了各种工具。 觉得MinerU确实不错。 参考此链接进行操作 MinerU/docs/README_Ubuntu_CUDA_Acceleration_en_US.md at master opendatalab/MinerU GitHub 需要注意的几个点: 1. 使用root账户安装的,配置文件在…

李飞飞:Agent AI 多模态交互的前沿探索

发布于:2024 年 11 月 27 日 星期三 北京 #RAG #李飞飞 #Agent #多模态 #大模型 Agent AI在多模态交互方面展现出巨大潜力,通过整合各类技术,在游戏、机器人、医疗等领域广泛应用。如游戏中优化NPC行为,机器人领域实现多模态操作等。然而,其面临数据隐私、偏见、可解释性…