【C++】类和对象的基本概念与使用

本文通过面向对象的概念以及通俗易懂的例子介绍面向对象引出类和对象。最后通过与之有相似之处的C语言中的struct一步步引出C++中的类的定义方式,并提出了一些注意事项,最后描述了类的大小的计算方法。


一、什么是面向对象?

1.面向对象的概念

面向对象(Object-Oriented Programming,简称OOP)是一种编程范式,它通过将数据和操作数据的方法封装在对象(Object)中,以提高代码的重用性和可维护性。面向对象编程的核心概念包括:

  1. 对象(Object)对象是类的实例,包含数据和方法。数据通常被称为属性或字段,方法则是能够操作这些数据的函数。
  2. 类(Class)类是对象的蓝图或模板,定义了对象的属性和方法。通过类可以创建多个对象。
  3. 封装(Encapsulation):将数据和操作数据的方法封装在对象中,并对外界隐藏对象的内部实现细节。通过提供公开的方法(接口)来操作对象的数据。
  4. 继承(Inheritance):一个类可以继承另一个类的属性和方法,从而实现代码重用。继承使得子类可以扩展父类的功能。
  5. 多态(Polymorphism):多态允许不同类的对象可以通过相同的接口调用,具体调用的 实现根据对象类型的不同而不同。这使得程序具有更好的灵活性和可扩展性。

2.面向对象的简单例子

█ 类(Class)

可以想象成一个蓝图或模板。例如,我们要创建一辆车,那么“车”就是一个。这个类包含了所有车共有的属性,比如颜色、品牌、型号等,还有车能做的事情,比如启动、加速、刹车等。

█ 对象(Object)

是根据类创建的具体实例。比如,根据“车”这个类,我们可以创建具体的车:一辆红色的特斯拉,一辆蓝色的宝马等。每辆车都是一个对象,它们都有各自的颜色、品牌等属性,但它们都是从“车”这个类创建出来的

█ 封装(Encapsulation)
把车的属性(比如颜色、品牌)和行为(比如启动、加速)封装在一起,就像把这些东西装在一个盒子里。外面的人只能通过车提供的功能(比如按下启动按钮)来与车互动,而不需要知道车内部是怎么工作的。

█ 继承(Inheritance)
如果我们有一个“电动汽车”类,它可以继承“车”类的所有属性和行为,并且添加一些自己的特性,比如电池容量。这就像是你有了一个标准车的模板,然后在这个基础上进行扩展,增加一些新的功能。

█ 多态(Polymorphism)
多态让不同类型的车在调用相同的“启动”方法时表现不同。比如,对于一辆传统汽车,启动可能是点火;而对于电动汽车,启动可能是激活电池。尽管调用的都是同一个“启动”方法,但具体的行为是根据车的类型来决定的。

3.面向对象VS面向过程

        面向过程(Procedural Programming)是一种编程范式,它主要通过过程(函数或方法)的调用来解决问题,程序的执行是按照一系列步骤顺序进行的。

        C语言是面向过程的语言,而C++是面向对象的语言。

        如果我们要用程序思维解析洗衣服这一行为。面对过程的编程需要倒入水、导入洗衣粉、清洗衣物、拧干...等一系列的函数,然后使用者一一调用这些函数,而面向对象就像一个洗衣机,他将洗衣服的这些方法和对象糅合在一个类里,使用者只要拿一些衣物放入洗衣机就可以直接完成这一行为。


二、类的简单使用

1.结构体与类

        结构体和类是没有什么直接的关系的,但是他们还是有一些相似之处。

        在C语言中,结构体可以将不同类型的数据结合在一起,可以描述数据成员的属性但是不能有方法(函数)存在,否则就会报错。

C语言文件,结构体包含函数编译无法通过

        而C++是兼容C语言的,C++中仍然有结构体这个概念,C语言文件中能够运行的它都可以执行,但是C++中的结构体有一些扩展,使得其与类非常的相似。

C++文件中,结构体可以添加函数(方法)

2.结构体——>类

1)struct——>class

        想要从结构体转变为类,首先需要将前面的修饰struct改为class

2)访问限定符

①定义

在C++中,访问限定符(Acess Specifiers)用于控制类或者结构体成员的访问权限。一共有三个,分别为public(公开访问,任何地方都可以访问) 、protected(保护访问,只有类本身、友元和派生类可以访问)、plivate(私有访问,只有类本身和友元可以访问,派生类无法访问)。

(成员声明为public后,这些成员可以从类的外部直接访问,这通常用于类的接口部分。)

②使用
class date
{public:void print_d(){cout << year << "年" << month << "月" << day << "日" << endl;;}private:int _year;int _month;int _day;
};
③注意事项☆
  • 类定义的惯例:成员变量一般都设为私有(而且内部的变量一般都会在前面稍加修饰,如_year
  • 访问权限作用域从该访问限定符出现的位置直至下一访问限定符出现或到类体结束为止
  • class的默认访问权限为private,struct为public
  • 访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。(访问限定符只是在编译期间进行访问控制,防止在代码中不正确或不安全的访问,但是这些数据在内存上是没有什么差别的)

3.类的定义

class ClsssName
{//类体:成员函数和成员变量public://...成员函数之类的
private://...成员变量};  //;不能忘
  • 类里定义的函数最好是定义和声明分离,在定义处要指明类域
  • (void class::print_d() {//...} )。默认在类里面定义的是inline(会进行隐式内联)。

4.类的实例化(对象)

        类是一个蓝图,对象就是蓝图的实现,类与对象是一对多的关系。

1.对象的定义

        基于以上的Date类进行实例化:(分别创造了d1,d2和a三个对象)

int main()
{Date d1;Date d2;Date a;return 0;
}

   此时d1._year++;d2._year++;是不一样的,它们是两个对象。 

2.类对象的大小

        一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。类并没有占实际的物理空间,是不能直接使用的,但是我们可以描述类的大小,它和对象的大小是一样的。

  • 一个类的大小,实际就是在内存对其的条件下该类中成员变量的大小,因为不同的对象每次调用的函数是一样的,为了避免每次实例化都创建一个新函数,类的成员函数被保存在公共代码段,不算在类的大小中。
  • 一个空类或者只有成员函数的类大小是一个字节。虽然里面没有成员变量,编译器给空类一个字节来唯一标识这个类的对象。

以下是在vs编译器下的大小计算(vs默认对齐数为8)

(内存对齐规则参考博文)

class date
{
private:int year;int month;int day;
public:void print_d(){cout << year << "年" << month << "月" << day << "日" << endl;;}
};
//sizeof(date)为12class A
{int _a;int* _b;short _c;float _d;
};
//int4,int*8,short2,float4 sizeof(A)为24class B
{void func();
};
//sizeof(B)为1class D
{class E{};
};
//sizeof(D)为1

-The End- 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

CH390H+STM32F1+LWIP

文章目录 1、CH390芯片介绍2、电路部分3、LWIP调试3.1修改点13.2 修改点2 4、结果展示参考 1、CH390芯片介绍 官网地址&#xff1a; 南京沁恒微电子股份有限公司 特点&#xff1a; 2、电路部分 CH390及接口&#xff1a; STM32F1引脚&#xff1a; 不含LWIP的demo及LWIP…

vue3+ts 封装echarts,根据tabs切换展示

<div class"bottom"><div class"topli"><p>用电统计</p><div class"tabs"><div class"tab" :class"{ active: active.tab1 index }"v-for"(item, index) in tabsList1" :key&q…

Pikachu SQL注入训练实例

1 数字类型注入 打开Burp Suit工具&#xff0c;选择Proxy&#xff0c;之后点击Open Browser打开浏览器&#xff0c;在浏览器中输入http://localhost:8080/pikachu-master打开Pikachu漏洞练习平台。 选择“数字型注入”&#xff0c;之后点击下拉框随便选择一个ID&#xff0c;…

Apple Vision Pro 和其商业未来

机器人、人工智能相关领域 news/events &#xff08;专栏目录&#xff09; 本文目录 一、Vision Pro 生态系统二、Apple Vision Pro 的营销用例 随着苹果公司备受期待的进军可穿戴计算领域&#xff0c;新款 Apple Vision Pro 承载着巨大的期望。 苹果公司推出的 Vision Pro 售…

测试——进阶篇

内容大纲: 软件测试的各种技术 1. 按照测试对象划分 1.1 界面测试 内容: 验证界面内容显示的完整性&#xff0c;一致性&#xff0c;准确性&#xff0c;友好性。比如界面内容对屏幕大小的自适应&#xff0c;换行&#xff0c;内容是否全部清晰展示&#xff1b;验证整个界面布局…

SAP ABAP性能优化分析工具

SAP系统提供了许多性能调优的工具&#xff0c;重点介绍下最常用几种SM50, ST05, SAT等工具&#xff1a; 1.工具概况 1.1 SM50 / SM66 - 工作进程监视器 通过这两个T-code, 可以查看当前SAP AS实例上面的工作进程&#xff0c;当某一工作进程长时间处于running的状态时&#…

AI 大事件:超级明星 Andrej Karpathy 创立AI教育公司 Eureka Labs

&#x1f9e0; AI 大事件&#xff1a;超级明星 Andrej Karpathy 创立AI教育公司 Eureka Labs 摘要 Andrej Karpathy 作为前 OpenAI 联合创始人、Tesla AI 团队负责人&#xff0c;他的专业性和实力备受瞩目。Karpathy 对 AI 的普及和教育充满热情&#xff0c;从 YouTube 教程到…

【C++报错已解决】 “Use of Uninitialized Variable“

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在编程过程中&#xff0c;遇到 “Use of Uninitialized Variable” 报错可能会让人感到困惑。这个错误提示通常意味着你尝…

【BUG】已解决:ValueError: Expected 2D array, got 1D array instead

已解决&#xff1a;ValueError: Expected 2D array, got 1D array instead 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉…

Vue脚手架安装(保姆级)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

常用的点云预处理算法

点云预处理是处理点云数据时的重要部分&#xff0c;其目的是提高点云数据的质量和处理效率。通过去除离群点、减少点云密度和增强特征&#xff0c;可以消除噪声、减少计算量、提高算法的准确性和鲁棒性&#xff0c;从而为后续的点云处理和分析步骤&#xff08;如配准、分割和重…

防火墙--带宽管理

目录 核心思想 带宽限制 带宽保证 连接数的限制 如何实现 接口带宽 队列调度 配置位置 在接口处配置 带宽策略配置位置 带宽通道 配置地方 接口带宽、带宽策略和带宽通道联系 配置顺序 带块通道在那里配置 选项解释 引用方式 策略独占 策略共享 重标记DSCP优先…

keysight P9370A/P9375A USB矢量网络分析仪

Keysight P9370A USB 矢量网络分析仪&#xff0c;4.5 GHz P937xA 系列是是德科技紧凑型矢量网络分析仪&#xff08;VNA&#xff09;&#xff0c;其价格适中&#xff0c;并采用完整的双端口设计&#xff0c;可以显著减小测试需要的空间。这款紧凑型VNA 覆盖十分宽广的频 率范围…

移动终端的安全卫士

随着移动互联网的快速发展&#xff0c;移动端安全风险频发。设备指纹技术凭借高精度的设备识别能力&#xff0c;能够帮助企业提升移动端安全防护能力&#xff0c;精准区分合法与风险行为&#xff0c;跨行业赋能风控&#xff0c;为金融、电商、游戏等多领域提供强大的业务安全保…

基于python的图像去水印

1 代码 import cv2 import numpy as npdef remove_watermark(image_path, output_path):# 读取图片image cv2.imread(image_path)# 转换为灰度图gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用中值滤波去除噪声median_filtered cv2.medianBlur(gray, 5)# 计算图像的梯…

数据结构——栈和队列(C语言实现)

写在前面&#xff1a; 栈和队列是两种重要的线性结构。其也属于线性表&#xff0c;只是操作受限&#xff0c;本节主要讨论的是栈和队列的定义、表示方法以及C语言实现。 一、栈和队列的定义与特点 栈&#xff1a;是限定仅在表尾进行插入和删除的线性表。对栈来说&#xff0c;表…

ABAP小白开发操作手册+(六)创建维护视图及事件

目录 开发类型&#xff1a; 开发申请&#xff1a; 开发步骤&#xff1a; 1、创建后台表 2、生成维护视图 3、隐藏自带字段 4、事件代码编写 5、配置事务代码 6、其它个性化需求 6.1、修改维护视图字段的可见长度 6.2、根据后台表查看对应维护视图的事务代码 代码如下…

Modbus通讯接口选择分析

Modbus通讯接口选择分析 Modbus通讯接口的选择涉及到多个方面的考量&#xff0c;包括但不限于通讯距离、数据传输速率、成本、设备兼容性以及应用场景等。下面将从这些角度出发&#xff0c;对Modbus通讯接口的选择进行详细的分析。 Ip67防水面板法兰插座 通讯距离 Modbus通讯…

卸载docker简单且ok的方法

杀死所有容器 docker kill $(docker ps -a -q) 删除所有容器 docker rm $(docker ps -a -q) 删除所有镜像 docker rmi $(docker images -q) 停止docker服务 systemctl stop docker 查看安装列表 yum list installed|grep docker 依次卸载已安装的docker yum -y remove docke…

【iOS】——ARC源码探究

一、ARC介绍 ARC的全称Auto Reference Counting. 也就是自动引用计数。使用MRC时开发者不得不花大量的时间在内存管理上&#xff0c;并且容易出现内存泄漏或者release一个已被释放的对象&#xff0c;导致crash。后来&#xff0c;Apple引入了ARC。使用ARC&#xff0c;开发者不再…