【C++初阶】:类与对象(上)

news2024/11/20 2:39:11

类与对象

  • 一.面向对象的初步认识
  • 二.初步认识类
  • 三.类的权限
  • 四.类的声明和定义
  • 五.封装
  • 六.类的实例化
  • 七.类的大小

一.面向对象的初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

例如洗衣服

在这里插入图片描述

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

在这里插入图片描述

二.初步认识类

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数

这里是c语言实现的栈传送门,通过比较就可以知道为什么会出现类的概念了。

在这里插入图片描述
在这里插入图片描述

上面的struct stack就是一个类,可以把一个栈的多个功能写在一个花括号内。在c++中,上面的struct更喜欢用class替代。

三.类的权限

我们对上面的代码进行改进,将struct改成class。

在这里插入图片描述

但是编译器直接告诉我不可访问,为什么struct可以直接编过而class却不能呢?这就涉及到类的权限问题了。

访问权限分为三种
在这里插入图片描述

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

插个小帖子,现阶段认为私有和保护是一样的,直到继承时才进行区分。

简单来说,如果你想要函数能在外部被访问,就需要加上public

在这里插入图片描述

那么public的作用到哪里结束呢?直到遇到下一个限定符或者结束。

在这里插入图片描述

上面的public作用到private结束,private向下直到类结束。

总体来说struct和class是没有什么区别的,最大的不同就是struct默认权限是公有,class默认情况是私有,所以上面的代码直接将struct换成class是不可访问的。

四.类的声明和定义

类也可以声明和定义分离,那么是如何做到的呢?现在将上面的代码改造一下。

在这里插入图片描述

我们这里将init函数踢出,只在类里面声明,在fun.cpp里定义。

在这里插入图片描述

这样就可以实现类里函数声明和定义的分离。注意每一个类都是一个作用域,所以在定义时要加上域名,不然就会出现下面无法识别的问题。

在这里插入图片描述

这里编译器就不知道去哪里找_array,_size…符号。

那么我们可以在类里声明内联函数吗?

在这里插入图片描述

答案是不可以,内联函数的声明和定义是不可以分开的,具体原因大家可以看看这篇博客传送门

注意:在类里直接定义的函数会被默认为内联函数(这是c++的规定),所以如果一个函数过长,我们通常将其声明和定义分离出来。当然如果我们直接在类里定义了一个很长的函数,那么它真的就会变成内联函数吗?其实也不是,具体原因可以看看这篇博客传送门

顺便插一个不好的变成习惯

在这里插入图片描述

这里右边的year其实是init的参数year,因为优先使用局部域。private里的year是出于类域的。这里编译器不会报错,但很影响代码的可读性。

五.封装

在这里插入图片描述

在这里插入图片描述

在c语言中可以直接通过修改_array来达到目的,但这种操作是不规范的。在c++里我们将其设置为了私有,那么就可以强制程序员去调用函数来修改_array,规范了变成。

六.类的实例化

在上面的代码里,我们可以很明显的看到Init函数是声明,push,top…函数是直接在类里定义。那么下面的_array,_size…变量是声明还是定义呢?

在这里插入图片描述

答案都是声明。变量的声明和定义在于是否开辟空间。

在这里插入图片描述

这些变量并非一个一个定义的,而是一起定义的。而定义这些变量的过程就被称为类实例化对象或者对象定义。

在这里插入图片描述

这里举个例子,如果我们将pravate删掉,意味着这些变量可以直接访问,那么我们能直接赋值吗?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

很明显是不能的,类就像是一张图纸,你很明显不能在图纸里放上一把椅子或者桌子,你必须依照图纸将这个房子的空间建出来,才能够往里面放入家具。

七.类的大小

我们创造了一个对象s,那么这个类的大小是多少呢?

在这里插入图片描述

在这里插入图片描述

答案是12。结论是对象中只储存成员变量,不储存成员函数。

在这里插入图片描述

我们应该怎样理解这个现象呢?其实也很简单,我们再创立一个对象。

在这里插入图片描述

两个对象的_size是一样的吗?很明显不是的。如果我们类比一下,就好像变量是每个房子的厕所,厨房…每个房子都要这些空间并且是独立的。而函数就像小区的花园,篮球场,多户人共用一个就可以了。(当然也可以每户人都建一个花园,但很明显太浪费了)

总结:每个对象所建立的对象都是独立的,而函数的调用都是同一个函数。

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

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

相关文章

GFD233A 3BHE022294R0103

GFD233A 3BHE022294R0103 ABB KUC321AE PLC模块 HIEE300698R0001 KU C321 AE01 ABB KUC711 3BHB004661R0001 高压变频模块 KUC711AE ABB KUC755AE105 3BHB005243R0105 驱动控制系统模块 KUC755 ABB KUC755AE106 3BH005243R006 控制系统模块 KU C755 AE 106 ABB LDGRB-01 3BSE01…

react-10 函数式写法rsf,配合HOOKS钩子函数

函数式跨组件通信: useContext 实现跨组件传值,内层组件获取context中的值 用来解决同一个父组件的后代组件之间的数据共享问题, 同一个父组件的所有后代组件都可以用 useContext() 从最近的 context 中获取. 性能优化:useMemo &#xff1a…

cv2 五边形矫正,python ,多边形透视变换

#图像透视变换--矫正 #根据最大的5边形进行透视变换 #获取最大和最次长 周长对应的轮廓 #该轮廓进行5边形拟合逼近 #进行透视变换:应用两线交点 import numpy as np import cv2#大津阈值法 OSTU def myApprox(con,pointnum5):# con为预先得到的最大轮廓num 0.001…

2023年CDGA/CDGP数据治理工程师认证报名需要什么条件?

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

mybatis01-Lombok、mybatis原理、参数处理、模糊查询、结果封装

mybatis01 Lombok 一、Lombok的使用 Lombok 是一个Java库,能自动插入编辑器并构建工具,简化Java开发。通过加注解的方式,不需要为类编写getter、setter、constructor或equals,同时可以自动化日志变量。 第一步、在pom.xml中加…

基于动态车辆模型的百度Apollo LQR和MPC横向控制算法分析(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 Apollo 是由百度发起的一个高效、灵活的基于自动驾驶的测试和研发的平台。Apollo 的主要逻辑为局部规划 轨道跟踪。在局部规划…

4.1 插值概念与基础理论

学习目标: 学习插值的基础理论可以从以下几个方面入手: 理解插值的概念:插值是指根据已知数据点的函数值,构造出经过这些点的函数,用于在已知数据点之间估计函数值。可以将其看做是一种函数逼近的方法。 掌握插值多项…

【Linux】MySQL高可用之Mysql读写分离实践

一、MySQL读写分离原理 读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。 二、读写分离实践 绝大多数的企业的…

居家办公远程控制电脑怎么操作

居家办公或者混合办公,正成为一种新的流行趋势。如何更好地居家办公,实现更高的工作效率和更舒适办公体验,我们总结出如下建议。 无论您是每周远程工作几天还是全职工作,无论是出于选择还是因为健康状况或天气事件,都…

部署YUM仓库及NFS共享服务

一、YUM仓库服务 1)YUM概述 YUM(Yellow dog Updater Modified) 基于RPM包构建的软件更新机制 可以自动解决依赖关系 所有软件包由集中的YUM软件仓库提供 linux本身就是以系统简洁为自身优势,所以在安装操作系统的时候并没有将…

Kaggle往期赛 | 多目标推荐系统大赛baseline

来源:深度之眼 作者:比赛教研部 编辑:学姐 Kaggle OTTO – Multi-Objective Recommender System多目标推荐系统大赛 赛题分析baseline 1、赛题链接 https://www.kaggle.com/competitions/otto-recommender-system/overview 2、赛题描述 本…

聚观早报 |字节与Meta争夺VR开发者;苹果设备无故要求输入ID密码

今日要闻:字节与Meta争夺VR应用开发者;苹果设备无故要求输入ID密码;余承东称25年是智能电动汽车分水岭;小鹏回应G6售价及配置信息曝光;亚马逊将在爱尔兰裁员200人 字节与Meta争夺VR应用开发者 4 月 14 日消息&#xf…

运筹说 第89期|网络计划-网络计划的优化

通过画网络图并计算时间参数,我们已得到了一个初步的网络计划,而网络计划技术的核心却在于从工期、成本、资源等方面对这个初步方案做进一步的改善和调整,以求得最佳效果,这一过程,就是网络计划的优化。接下来让我们跟…

家用洗地机到底好不好用?国产性价比高的品牌

洗地机作为一种高效、节能、环保、卫生的清洁设备,不仅能够提升清洁效率,还能有效减少清洁成本,更重要的是,它可以帮助我们创造一个更加健康和舒适的生活环境。而且除菌方面大部分都是采用电解水的除菌方式,更加环保和…

【我的创作纪念日—5周年】

序言 用心生活,用力向上,微笑前行,就是对生活最好的回馈。 机缘 最开始写文章,没想那么多,主要是记录一下,就随便写了下,后来认识了一些写文章的小伙伴,在和他们的沟通中越来越体会到…

PACS/RIS影像管理系统源码,采用VC++编程语言,提供三维图像后处理和算法

PACS/RIS影像管理系统源码 医学影像管理(PACS/RIS)系统是一套完整的提供DICOM标准遵从、高效的实现医学影像归档存储、通讯和诊断处理功能的医学影像信息管理系统,其基于DICOM/HL7标准的开放性架构和模块化的结构体系,确保了系统…

自动驾驶就是在扯?比亚迪你凭什么?

比亚迪“炮轰”自动驾驶 上周,在比亚迪2022年财报交流会上,有投资人问比亚迪在自动驾驶方面的发展进度和规划,比亚迪集团董事长王传福直言:“无人驾驶那都是扯淡,弄个虚头巴脑的东西那都是忽悠,它就是一场皇…

【超算/先进计算学习】日报4

目录 今日已完成任务列表遇到的问题及解决方案任务完成详细笔记高性能算法计算机算法的特征及内涵科学计算算法的主要分类高性能算法与传统算法的异同稀疏矩阵向量乘法 SpMV 与稀疏矩阵存储结构常见的稀疏矩阵传统存储与其SpMV算法不同的稀疏矩阵传统存储结构存储效率与稀疏度针…

Linux进程概念及状态

Linux进程概念及进程状态 目录 Linux进程概念及进程状态引入1、什么是进程1.1 描述进程1.2 task_struct组织进程1.3 proc目录 2、进程标识符3、查看进程4、bash进程5、初始fork6、进程状态6.1 操作系统层面6.2 Linux内核源代码RSDX 6.3 僵尸进程6.4 孤儿进程关于kill指令 引入 …

nssctf web 入门(9)

[SWPUCTF 2021 新生赛]sql [SWPUCTF 2021 新生赛]sql 可以猜测做了过滤 这里可以bp跑一下看过滤了哪些 尝试发现过滤了空格/**/在sql中代表注释符在mysql中这个可以用来代表空格 发现--被过滤 #也不行我们试下url编码的#也就是%23 成功了 3个字段 得到库名test_db 这里提示非…