【C++语言】初步认识面向对象编程类和对象(上)

在这里插入图片描述


文章目录

  • 前言
  • 一.初步认识面向过程和面向对象编程
    • 1.面向过程编程初步认识
    • 2.面向对象编程初步认识
  • 二.C++类
    • 1. 类的引入:
    • 2. 类的定义
    • 3.类的访问限定符&&封装
      • 3.1 访问限定符
      • 3.2 封装
    • 4.类的实例化
    • 5.如何计算类的大小
  • 总结
  • C++语言系列学习目录


前言

  1. 面向对象编程
  2. 类与对象

一.初步认识面向过程和面向对象编程

1.面向过程编程初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
在这里插入图片描述
在这里插入图片描述
面向过程编程(Procedural Programming) 是一种编程范式,它依赖于过程调用来实现程序的逻辑。它把程序视作一系列的程序执行步骤或者说是函数调用序列。这种方法强调的是在程序中执行一系列的计算步骤或者操作序列,而不像面向对象编程那样强调数据的抽象和封装。

与面向对象编程相比,面向过程编程通常更简单直接,适合于小型至中等规模的项目,或者特定类型的应用,如脚本编写和系统工具。然而,对于大型和复杂的应用程序,缺乏抽象和封装可能导致代码难以管理和扩展。

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

2.面向对象编程初步认识

面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它使用“对象”来设计应用程序和计算机程序。它侧重于数据抽象、封装、多态性和继承等概念。下面是面向对象编程的一些基本原则和概念:

  • 类(Class):类是对象的蓝图或者模板,它定义了一组具有相同属性(字段或变量)和行为(方法或函数)的对象的通用特性。

  • 对象(Object):对象是类的实例。每个对象都包含了类定义的数据和行为,具有独立的属性值(也可以称为状态),是程序操作的基本单位。

  • 属性(Attribute):属性是对象的状态,用变量表示。它们是存储在类或对象中的数据。

  • 方法(Method):方法表示对象可以执行的操作,是与对象相关联的函数。

  • 封装(Encapsulation):封装是把对象的实现细节隐藏起来,仅对外提供一个公共的接口。通过访问控制(private、protected、public),我们可以控制对象属性和方法的访问级别。

  • 继承(Inheritance):继承允许一个类继承另一个类的特性,即子类可以继承父类的属性和方法。这样可以实现代码复用,并建立类之间的层次关系。

  • 多态性(Polymorphism):多态性允许不同类的对象以统一的接口被处理。例如,通过覆盖(overriding)和重载(overloading)方法,不同的对象可以用相同的方法名实现不同的功能。

  • 抽象(Abstraction):抽象是简化复杂的现实问题的一种手段,它允许开发者聚焦于高级操作,而忽略底层的细节。抽象可以通过抽象类和接口来实现。

通过使用面向对象的方法,程序员能够以更直观的方式构建和理解复杂的系统,因为它们可以利用现实世界中的类比来设计系统的组件。大型软件项目通常易于管理,因为OOP提供的模块化使得编程更加组织化,代码也更易于维护和调试。面向对象编程广泛应用于许多不同类型的语言如Java、C++、Python、Ruby和C#等。

二.C++类

1. 类的引入:

在C语言中我们写结构体(struct),只能定义变量。在C++中,结构体不但可以定变量,还可以定义函数。这是因为我们把struct当成与类相近的关键字了。在C++中,我们更喜欢用class关键字来定义结构体等。

2. 类的定义

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

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

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

类有两种定义方式:

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

  2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
    在这里插入图片描述
    一般情况下,更期望采用第二种方式。第一种方式更方便,第二种定义更符合工作所需。

3.类的访问限定符&&封装

3.1 访问限定符

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

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)
    注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

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

3.2 封装

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

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

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

总结:封装主要两个方面,数据隐藏(更安全)和提供接口(方便用户交互使用)。

4.类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类是对对象的描述,是一个模型一样的东西,限定了类的成员。比如我们要描述一个学生,他就有很多属性,名字,学号,性别等等属性,但没有给定具体数据,类只是个模板。
  2. 一个类可以实例化多个对象。类是一个模板,没有具体数据,可以实例化多个对象。
  3. 类并不会分配具体的内存空间来存储它。只是模板属性,并没有数据。

5.如何计算类的大小

其实这一点,我们在C语言便知道了,内存对齐。
实例:计算下方类的大小。

// 类中既有成员变量,又有成员函数
class A1 {
public:void f1(){}
private:int _a;
};
// 类中仅有成员函数
class A2 {
public:void f2() {}
};
// 类中什么都没有---空类
class A3 {};

运行结果:
在这里插入图片描述

结论:一个类的大小,实际就是该类中“成员变量”之和,当然要注意内存对齐,成员函数不占内存。注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。


总结

此篇博客为简要介绍面向过程与面向对象的概念及区别,类的实例化对象、定义、封装、以及类的大小。


C++语言系列学习目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加,添加超链接

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

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

相关文章

什么数据集成(Data Integration):如何将业务数据集成到云平台?

说到数据集成(Data Integration),简单地将所有数据倒入数据湖并不是解决办法。 在这篇文章中,我们将介绍如何轻松集成数据、链接不同来源的数据、将其置于合适的环境中,使其具有相关性并易于使用。 数据集成&#xff1…

今年消费新潮流:零元购商业模式

今天给大家推荐一种极具创新的电子商务模式:零元购商业模式 这个模式支持消费者以零成本或极低成本购买商品。这种模式主要通过返现、积分、优惠券等方式来减少支付金额,使消费者实现“零成本”购物的目标。 人民网在去年发表了一篇文章。 总结了一下&a…

【基础物理实验】【AFM虚拟实验】基于AFM的物质表面微观结构及力学性质表征仿真实验(上)【北京航空航天大学】

基于AFM的物质表面微观结构及力学性质表征仿真实验 说明: 本次实验为本科生《基础物理实验》课程中的虚拟实验部分,在虚拟实验平台中进行。 一、实验目的: 1. 掌握AFM的基本成像原理及系统结构; 2. 掌握AFM的基本操作技巧及操…

使用 Tranformer 进行概率时间序列预测实战

使用 Transformers 进行概率时间序列预测实战 通常,经典方法针对数据集中的每个时间序列单独拟合。然而,当处理大量时间序列时,在所有可用时间序列上训练一个“全局”模型是有益的,这使模型能够从许多不同的来源学习潜在的表示。…

HCIP的学习(9)

OSPF的接口网络类型 ​ OSPF的接口在某种网络类型下的工作方式。 网络类型OSPF接口的工作方式BMABroadcast;可以建立多个邻居关系。需要进行DR选举。hello 10S;dead 40S。P2PP2P;只能建立一个邻居关系,不需要进行DR选举。Hello …

操作系统:进程(二)

进程的状态 进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。 一个进程从创建而产生至撤销而消亡的整个生命期间,…

强化学习-Reinforcement learning | RL

目录 什么是强化学习? 强化学习的应用场景 强化学习的主流算法 强化学习是机器学习的一种学习方式,它跟监督学习、无监督学习是对应的。本文将详细介绍强化学习的基本概念、应用场景和主流的强化学习算法及分类。 什么是强化学习? 强化学习并不是某一种特定的算法,而是…

【好书推荐-第十五期】《 机器学习基础:从入门到求职》(博文视点出品)

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号:洲与AI。 🎈 本文专栏:本文收录…

python 重载内置函数吗

python中是不支持函数重载的,但在python3中提供了这么一个装饰器functools.singledispatch,它叫做单分派泛函数,可以通过它来完成python中函数的重载,让同一个函数支持不同的函数类型,它提供的目的也正是为了解决函数重…

Problem #8 [Easy]

This problem was asked by Google. A unival tree (which stands for “universal value”) is a tree where all nodes under it have the same value. Given the root to a binary tree, count the number of unival subtrees. For example, the following tree has 5 un…

osg渲染过程

目录 1、渲染最简单代码 2、详解run方法 3、详细过程 4、回调函数 5、Node Visitor 1、渲染最简单代码 2、详解run方法 3、详细过程 3.1 advance()方法 进行帧计数 3.2 eventTraversal() eventTraversal()响应用户操作,eventTraversal()遍历的是事件队列,而…

小型时间继电器ST3PA-C DC24V 带插座PF085A 导轨安装 JOSEF约瑟

ST3P系列时间继电器 系列型号 ST3PF-2Z(JSZ3F-2Z) 5s AC110V ST3PF(JSZ3F) 10s AC48V ST3PC-1(AH3-3) 5s DC24V ST3PC-1(AH3-3) 2h AC220V ST3PC-F(JSZ3C-F) AC380V ST3PA-E(JSZ3A-E) DC24V ST3PA-F(JSZ3A-F) DC24V ST3PF(JSZ3F) 10s AC36V ST3PC-1(AH3-3) 10s AC24V ST3PC-1…

OpenHarmony开发实例:【分布式游戏鉴权应用】

1.介绍 本文将介绍分布式游戏鉴权应用。操作过程为: 设备A点击“开始游戏”按钮,开始搜索周边设备。 设备A显示周边设备,点击设备B并发起连接请求,远程拉起设备B的FA。 设备B收到请求后,选择是否允许“开启游戏”。…

git am XXX.patch 文件内容解析

git am XXX.patch 文件内容解析 打补丁的两种方式: 1.patch XXX.patch 2.git am XXX.patch 例如: diff --git a/drivers/crypto/se/ce.c b/drivers/crypto/se/ce.c index e6f68286d4ce6..de1bcb46fbe6b 100644 --- a/drivers/crypto/se/ce.cb/drive…

【生产案例面试题】JVM调优

写作目的 最近上线了一个需求,遇到了一个JVM报警的问题,很荣幸能遇到,在此分享一下整个调优的过程。 背景 我们是中台服务,我们的甲方就是上游不同的业务。中台原则上是业务和能力分离,但是不可避免的是分不开&…

【示例】MySQL-SQL语句优化

前言 本文主要讲述不同SQL语句的优化策略。 SQL | DML语句 insert语句 插入数据的时候,改为批量插入 插入数据的时候,按照主键顺序插入 大批量插入数据的时候(百万),用load指令,从本地文件载入&#x…

Web地图服务规范之栅格瓦片地图服务:WMTS(WebMapTileService,网络地图瓦片服务)、TMS(TileMapService,瓦片地图服务)和XYZ

一、什么是栅格瓦片地图服务 这四种地图服务都是通过网络传输的栅格瓦片地图服务,这里有三个名词需要解释: 1、什么是栅格? 遥感影像、Dem等,就是图片。 2、什么是地图服务? 实际上,地图服务就是一个u…

如何在jmeter中把响应中的数据提取出来并引用

jmeter做接口测试过程中,经常遇到请求需要用到token的时候,我们可以把返回token的接口用后置处理器提取出来,但是在这种情况下,只能适用于当前的线程组,其他线程组无法引用到提取的token变量值,所以必须要生…

windows ubuntu子系统,单细胞篇 1.cellranger安装与分析

这几天,我将单细胞测序在windows ubuntu子系统中跑了一遍,将过程分享給大家。 单细胞测序conda create -n 10xdb #创建环境 conda activate 10xdbconda install -c bioconda cellranger -y #失败,可能源中没有 wget -O cellranger-7.…

使用深度学习集成模型进行乳腺癌组织病理学图像分类

基于预训练的VGG16和VGG19架构训练了四种不同的模型(即完全训练的 VGG16、微调的 VGG16、完全训练的 VGG19 和微调的 VGG19 模型)。最初,我们对所有单独的模型进行了5倍交叉验证操作。然后,我们采用集成策略,取预测概率…