【c++随笔11】面向对象和封装

【c++随笔11】面向对象和封装

  • 一、什么是面向对象编程?
    • 1、面向对象以对象作为程序的基本单元
    • 2、类和对象
    • 3、特性继承和多态性
  • 二、什么是封装?
    • 1、类的定义和访问修饰符
    • 2、封装数据和公共接口
    • 3、数据验证和处理
    • 4、封装的优点
    • 5、实际应用示例
  • 三、再次理解
    • 1、再次理解封装
      • 1.1、封装的意义和本质
    • 2、再次理解面向对象

  • C++ 是基于面向对象的程序,面向对象有三大特性 —— 封装、继承、多态。

当谈到C++编程时,面向对象编程(OOP:Object-Oriented Programming)和封装是两个重要的概念。通过面向对象编程,我们可以更好地组织和管理代码,并且提高代码的可维护性和可重用性。而封装允许我们隐藏数据的内部实现细节,并通过公共接口来访问和操作数据。本教程将深入介绍C++中的面向对象编程和封装的概念、语法和实际应用。

一、什么是面向对象编程?

1、面向对象以对象作为程序的基本单元

面向对象编程是一种编程范式,它以对象作为程序的基本单元,将数据和操作捆绑在一起。每个对象都是一个独立的实体,具有自己的特征(数据成员)和行为(成员函数)。

面向对象编程的核心思想是通过定义类来创建对象,从而模拟现实世界中的事物和关系。

2、类和对象

在C++中,我们使用class关键字定义一个类,描述了对象的特征和行为。类包含数据成员和成员函数,用于存储和操作对象的数据。例如,下面是一个简单的类定义:

class MyClass {
private:int myData;  // 私有数据成员public:void setMyData(int value) {myData = value;}int getMyData() const {return myData;}
};

通过类定义,我们可以创建一个或多个对象。对象是类的实例,它具有类中定义的数据成员和成员函数。以下是如何创建和使用对象的示例:

MyClass obj1;  // 创建一个对象obj1.setMyData(10);  // 调用对象的成员函数
int data = obj1.getMyData();  // 调用对象的成员函数

3、特性继承和多态性

面向对象编程还包括特性继承和多态性的概念。

  • 特性继承:
    通过继承,一个类可以获得另一个类的特性(数据成员和成员函数),从而实现代码的重用。派生类继承了基类的特征,并可以添加自己的特征。例如:
class BaseClass {
public:void baseFunction() {// 基类函数实现}
};class DerivedClass : public BaseClass {
public:void derivedFunction() {// 派生类函数实现}
};
  • 多态性:
    多态性允许以不同的方式处理具有相同基类的对象。通过使用虚函数和指针/引用,我们可以在运行时确定调用的是哪个类的函数。例如:
class BaseClass {
public:virtual void print() {cout << "Base Class" << endl;}
};class DerivedClass : public BaseClass {
public:void print() override {cout << "Derived Class" << endl;}
};int main() {BaseClass* ptr = new DerivedClass();  // 使用基类指针指向派生类对象ptr->print();  // 输出 "Derived Class"
}

二、什么是封装?

封装是面向对象编程的一个重要概念,它将数据和对数据的操作封装在一个类中。通过将数据成员声明为私有,封装确保数据只能通过类提供的公共接口进行访问和操作。封装提供了一种机制,用于隐藏数据的内部细节,从而增加代码的安全性、可维护性和可重用性。

1、类的定义和访问修饰符

在C++中,我们使用class关键字来定义一个类。类包含了数据成员和成员函数,用于描述对象的特征和行为。下面是一个示例:

class MyClass {
private:// 私有数据成员public:// 公共成员函数
};

在类定义中,我们可以使用访问修饰符来控制成员的可访问性:

public:公共成员可以在类外部访问,也可以在类内部访问。
private:私有成员只能在类内部访问,对外部是不可见的。
protected:受保护成员类似于私有成员,但可以被派生类访问。

2、封装数据和公共接口

封装的核心是将数据成员声明为私有,并通过公共成员函数提供对数据的访问和操作。例如,在类中,我们可以这样定义数据成员和成员函数:

class MyClass {
private:int data;  // 私有数据成员public:void setData(int value) {// 对数据进行验证和处理// ...data = value;}int getData() const {return data;}
};

在上面的示例中,data被声明为私有数据成员。然后,我们通过setData和getData两个公共成员函数来提供对数据的设置和获取。这样,外部代码只能通过公共接口来访问数据,无法直接访问私有数据。

3、数据验证和处理

封装还允许我们在公共接口内部对数据进行验证和处理。例如,在setData函数中,我们可以添加一些逻辑来确保数据的有效性。这可以包括范围检查、类型检查、数据转换等。以下是一个简单的示例:

void setData(int value) {if (value > 0) {data = value;} else {// 数据不合法,进行错误处理// ...}
}

通过在公共接口内部进行数据验证和处理,我们可以确保数据的有效性和一致性,增强代码的健壮性。

4、封装的优点

封装在C++编程中具有许多优点:

安全性:封装隐藏了数据的具体细节,防止外部代码直接访问和修改数据,提高了数据的安全性。
可维护性:封装将相关的数据和操作组织在一起,代码更易于理解、修改和维护。
可重用性:封装创建了独立的模块,使其可以在不同的程序中多次使用,提高了代码的可重用性。
抽象性:封装通过公共接口提供了抽象层级,外部代码只需关注接口而不必了解内部实现细节,提供了更高层次的抽象。

5、实际应用示例

假设我们正在开发一个学生管理系统。我们可以使用封装来定义Student类,包含学生的姓名、年龄等个人信息。以下是一个简化的示例:

class Student {
private:string name;int age;public:void setName(const string& newName) {name = newName;}string getName() const {return name;}void setAge(int newAge) {if (newAge > 0 && newAge <= 100) {age = newAge;} else {// 年龄不合法,进行错误处理// ...}}int getAge() const {return age;}
};

通过封装,我们可以确保学生的姓名和年龄数据被安全地存储在类的私有成员中。然后,我们提供公共成员函数来设置和获取这些数据,以便外部代码可以通过这些接口与学生对象进行交互。

这是一个简单示例,但它展示了封装在实际应用中的价值。通过封装,我们可以实现更安全、可维护和可扩展的代码,提高软件开发的效率和质量。

三、再次理解

1、再次理解封装

C++ 是基于面向对象的程序,面向对象有三大特性 —— 封装、继承、多态。

C++ 通过类,将一个对象的属性与行为结合在一起,使其更符合人们对于一件事物的认知,将属于该对象的所有东西都打包在一起。通过访问限定符选择性地将其部分功能开放出来与其他对象进行交互,而对于对象内部的一些实现细节,外部用户不需要知道,也没必要知道,就算知道了有些情况下也没用,反而增加了使用或维护的难度,导致整个事情变得复杂化。

封装是为了更好的管理,我想让你访问的我定义成公有,不想给你访问的我定义成私有或者保护。

1.1、封装的意义和本质

封装是一种更好的严格管理,不封装是一种自由管理。
封装的本质是一种管理。

2、再次理解面向对象

实际上,我们写的东西就是对现实进行映射,我们定义类就是对一类事情的描述。

类就是对现实世界中一类事物的抽象类别的描述,类可以实例化出很多对象,

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

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

相关文章

1,Opencv常用结构

1&#xff0c;Point类&#xff1a;点表示 point表示二维结构的点,(x,y) cv::Point point; point.x 100; point.y 100;2&#xff0c;Scalar类&#xff1a;颜色表示 cv::Scalar colorBlue(255,0,0);//蓝色 cv::Scalar colorGreen(0, 255, 0);//绿色 cv::Scalar colorRed(0, …

银行存取款系统

题目 ​ 一个简单的存取款系统,用户可以选择存钱、取钱、转账、修改密码和退出系统等业务。程序使用了菜单界面来展示业务选项,并根据用户的选择调用相应的函数进行处理。具体功能如下: 登录:实现登录功能,需要输入正确密码才能进入菜单系统。 菜单:显示菜单界面,列出其…

Go基础(待更新)

Go基础&#xff08;待更新&#xff09; 参考Go 语言教程 文章目录 Go基础&#xff08;待更新&#xff09;一、基本语法1、格式化输出2、声明并赋值1&#xff09;单变量赋值2&#xff09;多变量赋值 二、math工具包的使用三、函数1、参数传递1&#xff09;普通传递2&#xff09…

proxy 属性与方法

proxy 属性与方法实例 proxy 属性与方法 proxy 是 JavaScript 中的一个内置对象&#xff0c;它提供了一种机制来拦截并自定义对象的基本操作。 通过使用 proxy&#xff0c;我们可以在对象上定义自定义行为&#xff0c;例如拦截属性访问、函数调用、构造函数调用等。 proxy 对…

C++ 统计一个字符串当每个字符出现的权重。

abbccc$b b:2 本题目为第一步&#xff0c;读入待编码字符串&#xff0c;建造一个森林&#xff0c;请补全下列代码。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef char elemtype; //带权值的二叉树 typedef struct BiTNode{ elemtyp…

使用 rosdep 管理 ROS 2 依赖项

系列文章目录 文章目录 系列文章目录前言 清华源镜像使用一、什么是 rosdep&#xff1f;二、关于 package.xml 文件的一些小知识三、rosdep 是如何工作的&#xff1f;四、如何知道在 package.xml 中输入哪些 key &#xff1f;五、如何使用 rosdep 工具&#xff1f;5.1 rosdep 安…

力扣 141.环形链表和142.环形链表2

目录 1.环形链表Ⅰ解题思路2.环形链表Ⅰ代码实现3.环形链表Ⅱ解题思路4.环形链表Ⅱ代码实现 1.环形链表Ⅰ解题思路 利用快慢指针&#xff0c;快指针一次走两个&#xff0c;慢指针一次走一个&#xff0c;如果出现了快指针为空或者快指针的next为空的现象则说明不带环&#xff0…

Docker dnmp 多版本php安装 php8.2

Laravel9 开发需要用到php8.1以上的版本&#xff0c;而dnmp只支持到php8.0。安装php8.2的步骤如下&#xff1a; 1. 从/services/php80目录复制一份出来&#xff0c;重命名为php82&#xff0c;extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…

4 Tensorflow图像识别模型——数据预处理

上一篇&#xff1a;3 tensorflow构建模型详解-CSDN博客 本篇开始介绍识别猫狗图片的模型&#xff0c;内容较多&#xff0c;会分为多个章节介绍。模型构建还是和之前一样的流程&#xff1a; 数据集准备数据预处理创建模型设置损失函数和优化器训练模型 本篇先介绍数据集准备&am…

网络安全应急响应工具(系统痕迹采集)-FireKylin

文章目录 网络安全应急响应工具(系统痕迹采集)-FireKylin1.FireKylin介绍【v1.4.0】 2021-12-20【v1.0.1】 2021-08-09 2.客户端界面Agent支持的操作系统FireKylinAgent界面使用方式比较传统方式与FireKylin比较无法可达目标的场景应用对比 3.使用教程设置语言Agent配置&#x…

c++11中的线程库和包装器

c11 1. 线程库1.1 线程库1.2 锁mutex 2. 包装器2.1 funciton2.2 bind 1. 线程库 1.1 线程库 C11中的线程库提供了一种方便的方式来创建和管理线程。其中&#xff0c;std::thread是一个重要的类&#xff0c;它允许我们创建新线程并控制它们的执行。以下是std::thread的一些重要…

1822_使用python内置的库进行日期序列的生成

使用python的内置的库进行日期序列的生成 用到的库介绍 datetime 实现这样的功能其实只需要这一个库就够了&#xff0c;但是网络上找到的例程很多都额外增加了对time库的引用。只能说&#xff0c;这样不会出现错误&#xff0c;但是这样肯定会有一些计算资源上的消耗。 #!/u…

零信任网络:一种全新的网络安全架构

随着网络技术的不断发展&#xff0c;网络安全问题日益凸显。传统的网络安全策略往往基于信任和验证&#xff0c;但这种信任策略存在一定的局限性。为了解决这一问题&#xff0c;零信任网络作为一种全新的网络安全架构&#xff0c;逐渐受到人们的关注。本文将对零信任网络的概念…

MATLAB算法实战应用案例精讲-【图像处理】数字图像处理

目录 几个高频面试题目 图像分类、图像识别、目标检测的优缺点分析与算法比较 知识储备

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&…

同步网盘与云盘:哪个更好用?

同步网盘、同步云盘现在是热门的文件管理工具&#xff0c;在回答“同步网盘云盘哪个好用”这个问题之前&#xff0c;我们需要知道什么样的同步网盘、同步云盘算好用&#xff1f; 什么样的同步网盘云盘好用&#xff1f; 1、存储空间大 对于文件管理工具而言&#xff0c;存储空…

ORM-1 字段默认值

当在odoo页面新建一条记录的时候&#xff0c;前端会通过rpc调用后端模型的default_get 函数&#xff0c;根据前端传入的字段列表&#xff0c;来获取相对应的字段默认值。# odoo/models.pyapi.modeldef default_get(self, fields_list):""" default_get(fields_l…

[Hive] Map类型在表中是如何存储的

在 Hive 中&#xff0c;Map 类型是指键值对的集合&#xff0c;其中键和值都可以是任意数据类型。 在 Hive 表中&#xff0c;Map 类型通常被存储为结构体或者键值对列表。 具体来说&#xff0c;在表中&#xff0c;Map 类型通常分为以下两种存储方式&#xff1a; 文章目录 结构…

PCTA认证考试-01_TiDB数据库架构概述

TiDB 数据库架构概述 一、学习目标 理解 TiDB 数据库整体结构。了解 TiDB Server&#xff0c;TiKV&#xff0c;TiFlash 和 PD 的主要功能。 二、TiDB 体系架构 1. TiDB Server 2. TiKV OLTP 3. Placement Driver 4. TiFlash OLAP OLTPOLAPHTAP

思考的起点(一): 事实与判断

事实与判断是思考的主要组成部分&#xff0c;深入理解事实与判断的基本概念&#xff0c;了解其应用可以提升个体的思考质量; 关于事实真相 事实是认知的基础 1.很多事情没有真相, 或者说真相陷入历史的迷雾中, 无法被发现; 2.世界不需要真相&#xff0c;真相往往都是复杂又残…