C++系列——————类和对象(上)

news2024/10/6 10:30:49

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、面向对象的三大特征
  • 二、类的引入
    • 2.1类的定义
  • 三.类的访问限定符
    • 3.1访问限定符的介绍
    • 3.2.访问限定符的使用
  • 四、类的作用域
  • 五、类的实例化
  • 六、类对象模型
    • 6.1 如何计算类对象的大小
  • 总结


前言

在学习C语言你可能听到过,C语言是面向过程的语言,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成

一、面向对象的三大特征

c++面向对象的语言,同样的具备面向对象的特性:分装、继承、多态

特性一:封装
将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进交互。
(简单来说,就好比我们在学习c语言时使用的一些函数如:printf函数,我们在使用它的时候并不知道它的底层是怎么实现的)
特性二:继承

继承是一个进程,通过一个进程,一个对象可以获得另一个对象的属性(数据和函数),且可以想起加入属于自己的方法和属性。用这种方法可以自动的对一个类中提供另一个类的成员和数据结构。当A类被另B类继承,A类可以称之为基类或者父类;B类被称之为派生类或者子类。
特性三:多态

如果几个相似而不完全相同的对象,当对他发出同一个消息时,他们的反映各不相同,执行不同的操作。这种现象叫做多态现象。在C++中多态是指由继承而产生的相关的不同的类,其对象会对同一消息做出不同的相应。他能增加程序的灵活性。

二、类的引入

   C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量 
,也可以定义函数  。

在学习C语言时,我们并没有听到类的概念,c++是以C语言为基础,对其进行完善和拓展的,而c++是兼容C语言的,所以在c++中定义类的方式有两种。

struct classname
{
	//成员变量
	//成员函数
};

class classname
{
    //成员变量
	//成员函数
};
        当然以上两种方式存在差别,等一下我们会展开介绍。

2.1类的定义

代码如下(示例)
也可以将关键字struct替换为关键字class(可以将class看作struct的升级版)
也可以将关键字struct替换为关键字class
struct为定义类的关键字,stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。

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

这里需要注意,如果类的成员函数声明和定义都在类的内部,可能会被编译器当作内敛函数来处理。

  上面结构体的定义,在C++中更喜欢用class来代替 

三.类的访问限定符

3.1访问限定符的介绍

成员访问修饰符: 描述了类成员的访问控制,即所能使用的一个范围

公有的public:没有访问限制,其他类可以访问公有成员变量和方法。

保护的protected:只能在当前类和继承该类的子类中访问,受保护成员变量和方法对于其他类不可见。

私有的private :只能在当前类中访问,其他类无法直接访问。
在上面我们提到,虽然c++支持使用关键字struct和class来创建类,但是这两种方法还是会存在差异:
对于使用关键字class创建的类,其默认成员函数及成员变量是私有的(只允许该种类创建出来的对象访问),若是想进行访问,必须使用关键字public来修饰。

在这里插入图片描述

使用关键字struct创建的类,默认成员变量及成员函数是共有的,可以对它直接访问,这里就不演示了。

3.2.访问限定符的使用

访问限定符的作用域,是从使用第一个访问限定符开始,直到出现下一个访问限定符为止,若是此后未再出现访问限定符,则生效区域直到类的结束。
示例:
在这里插入图片描述

四、类的作用域

     类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用
  ::作用域操作符指明成员属于哪个类域。

示例:(声明定义分离)

class Person
 {
 public:
  void PrtPerson();
 private:
  char _name[20];
  char _gender[3];
  int  _age;
 }; 
// 这里需要指定PrtPerson是属于Person这个类域
void Person::PrtPersonInfo()
 {
     cout<<_name<<" "_gender<<" "<<_age<<endl;
 }

还有一种静态变量值的缺省,也需要用到,这个以后在介绍,感兴趣的可以搜搜。

五、类的实例化

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

  1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
  2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

六、类对象模型

6.1 如何计算类对象的大小

class Stack
{
public:
	void Init()
	{
		int* pos;
		pos = nullptr;
		top = capacity = 0;
	}
private:
	int* a;
	int top;
	int capacity;
};

问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小呢?
接下来我们就用上面的类展开讨论
我们回想在C语言中,我们计算一个对象的大小时,会使用操作符sizeof,那么我们尝试一下会得到什么结果:
在这里插入图片描述
可以看到计算的结果为16,只计算了类中的成员变量,成员函数所占的空间并没有计算。看来设计还是挺合理的,如果每用这个类型创建的一个对象,都要给它配一套成员函数,那也太浪费了。为了避免浪费,我们的C++祖师爷只保存了类中成员变量,成员函数存放在公共的代码段(所有使用这个类创建的对象,共有一块函数代码)

总结

在上面我们并没有提及结构对其的原则,大家在进行类大小计算时,要将其考虑在内!!!!!

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

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

相关文章

oracle中的INTERVAL函数学习总结

Oracle 从9i数据库开始引入了一种新特性&#xff0c;可以用来存储时间间隔&#xff0c;出现了INTERVAL 函数。这个函数的表达式比较多&#xff0c;初学比较费劲不好掌握&#xff0c;经过以几个小时的查阅资料和实验&#xff0c;总结如下&#xff1a; interval year t…

基于离散小波变换(DWT)的心电信号伪影去除及心电信号PQRST波检测(MATLAB R2018)

心电信号是心脏神经&#xff0c;肌肉组织电化学活动的表现形式。这些电化学活动使心脏内部产生一系列非常协调的电刺激脉冲&#xff0c;分别使心房&#xff0c;心室的肌肉细胞兴奋&#xff0c;从而有节律的舒张和收缩。这些生物电活动在体表的不同部位形成不同的电位差变化&…

模型构建器之迭代器

上一篇我们介绍了模型构建器的基础&#xff0c;将一个工作流串联起来&#xff0c;然后做成模型工具。今天我们介绍模型构建器的第二个重要功能——迭代&#xff0c;也就是程序中的循环。 先来看一个例子。要给数据库中所有要素类添加一个相同的字段&#xff0c;该怎么做&#…

docker镜像体积优化攻略参考—— 筑梦之路

简单介绍 镜像的本质是镜像层和运行配置文件组成的压缩包&#xff0c;构建镜像是通过运行 Dockerfile 中的 RUN 、COPY 和 ADD 等指令生成镜像层和配置文件的过程。 和镜像体积大小有关的关键点&#xff1a; RUN、COPY 和 ADD 指令会在已有镜像层的基础上创建一个新的镜像层&…

黑马es集群

1、为什么要做es集群 单机的elasticsearch做数据存储&#xff0c;必然面临两个问题:海量数据存储问题、单点故障问题 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard)&#xff0c;存储到多个节点 单点故障问题:将分片数据在不同节点备份(replica) 2、搭建es集群 1、用…

【技术实操】银河高级服务器操作系统实例分享,数据库日志文件属主不对问题分析

1. 问题现象描述 2023 年 06 月 30 日在迁移数据库过程中&#xff0c;遇到数据库 crash 的缺陷&#xff0c;原因如下&#xff1a;在数据库启动时候生成的一组临时文件中&#xff0c;有 owner 为 root 的文件&#xff0c; 文件权限默认为 640&#xff0c; 当数据库需要使用的时…

重生奇迹mu魔剑职业技能一览

1、火剑袭&#xff1a;魔剑士三转前4个技能中&#xff0c;核心技能火剑袭为buff技能&#xff0c;可在短时间内大幅提升自身伤害输出能力&#xff0c;由于提升的数值依赖于技能等级&#xff0c;因此一个高技能等级魔剑士的爆发能力相当恐怖。 2、天雷闪&#xff1a;是剩余技能中…

Sapphire开发日志(四)

任务描述 本周任务&#xff0c;将模型进行封装&#xff0c;实现模型推理的基本API&#xff0c;从而可以根据输入数据输出蒙版数据。 模型输入数据处理 首先进行模型输入数据的预处理。首先支持点击和框选两种模式&#xff0c;所以这里需要对这两种模式进行适配。 modelData…

微信小程序蓝牙连接部分Android14调用wx.setBLEMTU协商低功耗最大传输单元失败解决方案(部分安卓14设置超过23就会报错)

1.解决方案的核心内容&#xff1a;第一次设置失败不要管&#xff0c;在complate函数里面继续往下连接&#xff0c;然后设置一个定时器每1秒钟在重新设置一次&#xff0c;肯定会成功的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

使用compile_commands.json配置includePath环境,解决vscode中引入头文件处有波浪线的问题

通过编译时生成的 compile_commands.json 文件自动完成对 vscode 中头文件路径的配置&#xff0c;实现 vscode 中的代码的自动跳转。完成头文件路径配置后&#xff0c;可以避免代码头部导入头文件部分出现波浪线&#xff0c;警告说无法正确找到头文件。 步骤 需要在 vscode 中…

Java Sort 方法的使用(包含Arrays.sort(),Collections.sort()以及Comparable,Comparator的使用 )

目录 Comparable && Comparator的使用&#xff1a; Comparable: Comparator: Arrays.sort()的使用: 升序排序&#xff1a; 降序排序&#xff1a; 自定义排序方法&#xff1a; 在日常的刷题或开发中&#xff0c;很多时候我们需要对数据进行排序&#xff0c;以达到我…

【PHP项目实战训练】——laravel框架的实战项目中可以做模板的增删查改功能(1)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【银河麒麟V10服务器OS-系统根分区扩容】指导教程手册

【银河麒麟V10服务器OS-系统根分区扩容】指导教程手册 环境信息&#xff1a;VMware虚拟软件16.0 首先查看KylinOS服务器版本&#xff1a;nkvers 备注&#xff1a; (Tercel) 版本是 V10 SP1 版本&#xff0c; (Sword) 版本是 V10 SP2 版本&#xff0c; (Lance) 版本是 V10 …

开源与闭源 AI 模型:发展路径的比较与前瞻

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

super().__init__() 来自于哪个PEP

super() 的简化用法&#xff08;即不带参数的 super()&#xff09;是在 Python 3 中引入的。这个改进是由 PEP 3135 规范化的。 PEP 3135: New Super PEP 3135 标题为 “New Super”。它介绍了一种新的方式来调用超类的方法&#xff0c;即不再需要显式地传递当前类和实例&…

前端Vue小兔鲜儿电商项目实战Day04

一、二级分类 - 整体认识和路由配置 1. 配置二级路由 ①准备组件模板 - src/views/SubCategory/index.vue <script setup></script><template><div class"container"><!-- 面包屑 --><div class"bread-container">…

软件需求规格说明书(Word原件@配套软件全资料)

软件需求规格说明书编写规范编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件项目相关全套精华资料包获取方式①&#xff1a;点我获取 获取方式②&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档清单&#xff1a;工作安排任…

python操作mongodb底层封装并验证pymongo是否应该关闭连接

一、pymongo简介 https://pymongo.readthedocs.io/en/stable/github地址&#xff1a;https://github.com/mongodb/mongo-python-driver mymongo安装命令&#xff1a;pip install pymongo4.7.2 mymongo接口文档&#xff1a;PyMongo 4.7.2 Documentation PyMongo发行版包含Py…

AI绘画Stable Diffusion【实战】一下给我整破防了!!SD制作商业海报——香水海报

大家好&#xff0c;我是画画的小强 今天给大家分享关于SD制作商业海报案例——香水海报。内容很干&#xff0c;但很实用&#xff0c;后续也会持续分享一些其他商业海报的制作案例&#xff0c;喜欢的朋友请持续关注 人“狠”话不多&#xff0c;大家请上车&#xff01;&#xff…

VB.net 进行CAD二次开发(二)

利用参考文献2&#xff0c;添加面板 执行treeControl New UCTreeView()时报一个错误&#xff1a; 用户代码未处理 System.ArgumentException HResult-2147024809 Message控件不支持透明的背景色。 SourceSystem.Windows.Forms StackTrace: 在 System.Windows…