【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://www.mzph.cn/pingmian/47243.shtml

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

相关文章

【C++编程】标准模板库 STL 的基本概念

STL 从广义上分为&#xff1a;容器、算法、迭代器 容器、算法之间通过迭代器进行无缝连接 STL 六大组件&#xff1a; 容器&#xff1a;各种数据结构&#xff0c;如 vector、list、deque、set、map 等&#xff0c;用来存放数据 序列式容器&#xff1a;物理存放上有序关联式容器&…

约束条件和数据库的用户管理

数据库的增删改查 查 约束条件和用户管理 删 约束条件&#xff1a; 主键 主键约束 primary key 用于标识表中的主键列的值&#xff0c;而且这个值是全表当中唯一的&#xff0c;而且值不能为null。 一个表只能有一个主键。 外键&#xff1a;用来建立表与表之间的关系。…

微信小游戏 彩色试管 倒水游戏 逻辑 (四)

最近开始研究微信小游戏&#xff0c;有兴趣的 可以关注一下 公众号&#xff0c; 记录一些心路历程和源代码。 定义了一个名为 WaterFlow class&#xff0c;该类继承自 cc.Graphics&#xff0c;用于在 Cocos Creator 中创建和显示水流的动画效果。下面是对代码的详细解释&#x…

FPGA FIR fdatool filter designer MATLAB

位数问题 fdatool 先确定输入信号的位宽&#xff0c;比如17位在fdatool中&#xff0c;选set quantization parameters 选input/output 设置input word length 为17bit(not confirmed) fir compiler implementation 注意&#xff1a; 当设置输入位宽为16位时&#xff0c;ip核…

Linux系统部署MySQL数据库

1.Linux插入光盘&#xff0c;使用df-h获取光盘信息&#xff0c;默认/dev/sr0文件为光盘文件 使用命令 mount -o ro /dev/sr0 /media进行手动挂载 mount -o ro /dev/sr0 /media 2.进入cd /etc/yum.repos.d目录 编辑配置yum库&#xff0c;编辑vim yum.repos [BaseOS] nameba…

Flutter 状态管理新境界:多Provider并行驱动UI

前言 在上一篇文章中&#xff0c;我们讨论了如何使用 Provider 在 Flutter 中进行状态管理。 本篇文章我们来讨论如何使用多个 Provider。 在 Flutter 中&#xff0c;使用 Provider 管理多个不同的状态时&#xff0c;你可以为每个状态创建一个单独的 ChangeNotifierProvider…

node+MySQL+Express实现账户登录,注册,重置之登录篇

nodeMySQLExpress实现账户登录 实现技术开发工具项目结构效果图app.js代码db.jsrouter下的account.jsdb下的account.jslogin.html数据库结构 实现技术 node.js,MySQL5.7(8.0以上版本会报错)&#xff0c;layui(前端框架)&#xff0c;Express notify(消息通知layui插件) 开发工…

如何使用在线工具将手机相册中的图片转换为JPG格式

我们经常在手机相册中保存大量的图片&#xff0c;无论是家庭聚会的照片还是旅行的瞬间&#xff0c;每一幅图像都承载着珍贵的记忆。然而&#xff0c;有时候我们会遇到图片格式不兼容的问题&#xff0c;尤其是在需要将图片分享到特定平台或编辑时。 例如&#xff0c;某些社交平台…

Java语音转文字及文字转语音教学 (离线版)

1. 语音转文字 1.1 maven导入以下包 <!-- 获取音频信息 --> <dependency><groupId>org</groupId><artifactId>jaudiotagger</artifactId><version>2.0.3</version> </dependency><!-- 语音识别 --> <dependen…

C++知识要点总结笔记

文章目录 前言一、c基础1.指针和引用指针和引用的区别函数指针 2.数据类型整型 short int long 和 long long无符号类型强制类型转换 3.关键字conststaticconst和static的区别define 和 typedef 的区别define 和 inline 的区别const和define的区别constexprvolatileextern前置与…

Linux服务器LVM分区扩展

1、检查服务器当前分配磁盘 查看服务器物理磁盘分配情况&#xff0c;可见服务器当前配置磁盘SDA共250G&#xff0c;已划分区sda1:4G&#xff0c;sda2:146G&#xff1b;其中sda2分区分为两个lvm分区&#xff08;centos-root和centos-swap&#xff09;; 查看磁盘分区挂载情况&am…

【实战】安装Webtours

首先&#xff0c;安装jdk。过程如下图。 添加环境变量&#xff0c;如下图。 安装activeperl&#xff0c;如下图。 复制Webtours文件夹到计算机中&#xff0c;之后双击webtours文件夹中的xigui32.exe&#xff0c;启动webtours的应用服务器。 之后&#xff0c;可以在任务栏右下角…

CSA笔记2-文件管理命令

tree 以树状图显示多级目录 示例&#xff1a; [rootlocalhost ~]# tree haha/ haha/ └── 111 └── 222 2 directories, 0 files [rootlocalhost ~]# tree -L 1 haha/haha/ └── 111 echo > >> < << 示例&#xff1a; [rootxxx ~]#…

Linux限速工具:FlowMaster - IP级网络流量控制脚本

目录 前言&#xff1a; Github加速器&#xff1a; 简介 功能 安装方法 使用方法 数值单位 基本命令 选项 示例 启动 FlowMaster 重启 FlowMaster 停止 FlowMaster 查看状态 查看 Iptables 设置 许可证 贡献 联系我们 前言&#xff1a; 在市面上看了好多关于网…

MySQL执行状态查看与分析

当mysql出现性能问题时&#xff0c;一般会查看mysql的执行状态&#xff0c;执行命令&#xff1a; show processlist 各列的含义 列名含义id一个标识&#xff0c;你要kill一个语句的时候使用&#xff0c;例如 mysql> kill 207user显示当前用户&#xff0c;如果不是root&…

比Snipaste还好用的截图工具?

千鹿设计助手&#xff1a;千鹿设计助手官网 - 设计师效率神器 最近新出的一款截图工具千鹿设计助手&#xff0c;比Snipaste功能多一些。在Snipaste功能基础上&#xff0c;还支持长截图&#xff0c;截动图&#xff0c;还实时保留截图记录、支持OCR识别、文本识别、图片智能处理…

【CSS in Depth 2 精译_018】3.1.2 逻辑属性 + 3.1.3 用好逻辑属性的简写形式

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

Prometheus 云原生 - Prometheus 数据模型、Metrics 指标类型、Exporter 相关

目录 开始 Prometheus 数据类型 简单理解 时序样本 格式 和 命名要求 Metrics 指标类型 Counter 计数器 Gauge Histogram Summary Exporter 相关 概述 Exporter 类型 Exporter 规范 开始 Prometheus 数据类型 简单理解 a&#xff09;安装好 Prometheus 后会暴露…

乘积量化pq:将高维向量压缩 97%

向量相似性搜索在处理大规模数据集时&#xff0c;往往面临着内存消耗的挑战。例如&#xff0c;即使是一个包含100万个密集向量的小数据集&#xff0c;其索引也可能需要数GB的内存。随着数据集规模的增长&#xff0c;尤其是高维数据&#xff0c;内存使用量会迅速增加&#xff0c…

2024年大数据高频面试题(中篇)

文章目录 Kafka为什么要用消息队列为什么选择了kafkakafka的组件与作用(架构)kafka为什么要分区Kafka生产者分区策略kafka的数据可靠性怎么保证ack应答机制(可问:造成数据重复和丢失的相关问题)副本数据同步策略ISRkafka的副本机制kafka的消费分区分配策略Range分区分配策略…