【C++】类与对象的基础概念

目录:

一、inline

二、类与对象基础

        (一)类的定义

        (二)访问限定符

        (三)类域

        (四)实例化概念


正文

一、inline

在C语言的学习过程中,大家肯定了解过宏这个概念。宏定义函数肯定也不陌生吧,它的优点是:灵活,程序运行速度快(代码少的情况下)、不用指定参数类型、不需要开辟空间。缺点是:大代码量频繁替换增加程序负担、运算符优先级会有冲突、不能调试。

针对以上宏函数的缺点就有了inline的出现,C++祖师爷创造出了inline来替代宏函数的使用。

用法:

(1)⽤inline修饰的函数叫做内联函数,内联函数不需要建⽴栈帧(也就是不用为函数开辟空间)可以提⾼程序效率,编译时C++编译器会在调⽤的地⽅展开(替换)内联函(此处和宏一样,在预编译阶段处理)

正常函数运行时会在堆栈开辟空间,若内联函数展开(替换)就不需要开辟空间

(2)inline对于编译器而言只是⼀个建议inline适用于频繁调用的短小函数,代码相对多⼀些的函数加上inline也会被编译器忽略。

内联只是一个建议,你可以加但展不展开由编译器决定。编译时函数是会生成一条一条指令,一般当指令大于10条就不再展开函数。你可以想象一下:假设内联函数内有100条代码,如果编译器不干涉,要是调用1000次函数,重复的函数要展开(和宏替换一样)1000次每次100条指令,总程序代码长度为1000*100,运行起来将会很慢,所以编译器规定大于一定指令条数的内联函数不展开用栈帧为函数开辟空间调用。

栈帧开辟的函数空间不会因为你函数调用次数而改变原本大小。调用函数只执行一条代码就行,要是调用1000次函数,总程序代码长度为1000+100,相比内联函数快很多。

以下内联函数在编译时就不展开,忽略内联,Add函数将和普通函数一样在栈帧开辟空间。

(3)C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调试,C++设计了inline⽬的就是替代C的宏函数

(4)为⽅便调试,vs编译器 debug版本下⾯默认运行是不展开inline的。debug版本想展开需要自行设置。

(5)inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。

可理解为:定义一般在头文件内,程序运行时经过预处理,头文件会被展开,若内联函数符合编译器要求也会展开,而内联函数定义写在另一个文件,等执行到该语句编译器会认为在头文件已经展开过内联还函数了,此时不会再展开,而头文件展开的内联函数只是声明没有函数的有效地址,当调用该函数时无法找到地址就报链接错误。

错误写法:

   

正确写法:

【补充知识】正常函数定义不能写在头文件里

因为当头文件在不同文件中被包含多次,预编译时函数也会被展开多次,链接时就会生成多个函数,到时候调用不知道用哪一个会报冲突错误。解决办法是在头文件定义的函数前加static。因为static除了可以改变生命周期外还可以改变链接属性,让函数只能在该文件使用。

二、类与对象

(一)类的定义

(1)class为定义类的关键字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。

(2)为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。

(3)C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类

C++类不再需要typedef,ListNodeCPP就可以代表类型

(4)定义在类中的成员函数默认为inline函数。

(二)访问限定符

(1)C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限选择性的将其接⼝提供给外部的⽤⼾使⽤。

(2)public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。

例如:我给你提供了一个栈和一系列栈的函数,而你偏偏就自以为是觉得访问栈顶元素还要调用函数太麻烦,直接用右图方法,结果你不清楚我top并不是指向栈顶元素而是栈顶的下一个元素,你访问时没-1导致访问失败又反过来说我栈写的有问题。

以上错误就是C语言太自由导致的,所以C++祖师爷针对C语言做的一个优化创造出了类,你要访问我类里面的私有变量必须得通过我提供给你的类方法(函数)按我的规则去修改/访问,这样就不会出错。

(3)访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到 }即类结束。(如下图)

(4)class定义成员没有被访问限定符修饰时默认为private,struct默认为public。这是两者间最明显的区别

也就是class类体中没有public,你什么也访问不了,而struct定义的类体中没有访问限定符,原本我不想让你访问的成员变量也可以被访问。

(5)⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。成员变量是很重要的,一般不希望任何人能随意修改,必须调用类函数按规则修改。

(三)类域

(1)类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤ :: 作⽤域操作符指明成员属于哪个类域

(2)类域影响的是编译的查找规则,下⾯程序中Init如果不指定类域Stack,那么编译器就把Init当成全局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。

指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中查找。

(四)实例化概念

类就像一张图纸,你可以拿着这张图纸盖出多栋具体的房子。

如果类是一张图纸,那在它还没盖出实体房时,类是不占任何地面空间的。同理下图类的成员变量只是声明没有具体分配内存空间,类函数也是。

那么类成员什么时候才有具体的内存空间呢?

在拿这个类类型Date实例化对象d1和d2 的时候就自动分配内存空间(拿类类型实例化称为对象)

所以类真实存在有空间是实例化的时候(可理解为实实在在有空间叫实例化)

类与对象基础(上)加载完毕,有错别字或写不好的地方欢迎留言指出,必定虚心接受~


未完待续........

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab实现主成分分析方法图像压缩和传输重建

原创 风一样的航哥 航哥小站 2024年11月12日 15:23 江苏 为了研究图像的渐进式传输技术,前文提到过小波变换,但是发现小波变换非常适合传输缩略图,实现渐进式传输每次传输的数据量不一样,这是因为每次变换之后低频成分大约是上一…

python成长技能之网络编程

文章目录 一、初识Socket1.1 什么是 Socket?1.2 socket的基本操作1.3 socket常用函数 二、基于UDP实现客户端与服务端通信三、基于TCP实现客户端与服务端通信四、使用requests模块发送http请求 一、初识Socket 1.1 什么是 Socket? Socket又称"套接字",…

ROM修改进阶教程------安卓14 安卓15去除app签名验证的几种操作步骤 详细图文解析

在安卓14 安卓15的固件中。如果修改了系统级别的app。那么就会触发安卓14 15的应用签名验证。要么会导致修改的固件会进不去系统,或者进入系统有bug。博文将从几方面来解析去除安卓14 15应用签名验证的几种方法。 💝💝💝通过博文了解: 1💝💝💝-----安卓14去除…

[Docker#6] 镜像 | 常用命令 | 迁移镜像 | 压缩与共享

目录 Docker 镜像是什么 生活案例 为什么需要镜像 镜像命令详解 实验 1.一些操作 1. 遍历查看镜像 2. 查看镜像仓库在本地的存储信息 进入镜像存储目录 查看 repositories.json 文件 3. 镜像过滤 4. 下载镜像时的分层 实战一:离线迁移镜像 实战二&…

「QT」几何数据类 之 QVector3d 三维向量类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

人工智能(AI)对于电商行业的变革和意义

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/402a907e12694df5a34f8f266385f3d2.png#pic_center> 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再新空间代码工作室 📞工作室:新空间代…

物联网设备研究——分配推理负载的联合学习方法

概述 物联网(IoT)的最新发展导致人工智能模型被嵌入到传感器和智能手机等终端设备中。这些模型是根据每个设备的存储容量和计算能力定制的,但重点是在终端侧进行本地推理,以降低通信成本和延迟。 然而,与部署在边缘服…

CentOS Stream 9设置静态IP

CentOS Stream 9设置静态IP CentOS Stream 9作为CentOS Stream发行版的下一个主要版本,已经发布有一段时间,但与目前广泛使用的CentOS7有较大区别。安装试用Stream 9的过程中,就发现设置静态IP的方式和CentOS7/8差别较大,在此记录…

【嵌入式】ESP32开发(一)ESP-IDF概述

文章目录 1 前言2 IDF环境配置3 在VS Code中使用IDF3.1 使用ESP-IDF例程3.2 底部按钮的作用【重要!】3.3 高级用法4 ESP-IDF框架分析5 从零开始创建一个项目5.1 组件(component)6 主要参考资料7 遇到的一些问题与解决办法8 对于ESP-IDF开发的一些感受1 前言 对于ESP32的开发…

基于Multisim水箱水位控制系统仿真电路(含仿真和报告)

【全套资料.zip】水箱水位控制系统仿真电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.在水箱内的不同高度安装3根金属棒,以感知水位变化情况, 液位分1&…

解读Nature:Larger and more instructable language models become less reliable

目录 Larger and more instructable language models become less reliable 核心描述 核心原理 创新点 举例说明 大模型训练,微调建议 Larger and more instructable language models become less reliable 这篇论文的核心在于对大型语言模型(LLMs)的可靠性进行了深入…

zabbix监控端界面时间与服务器时间不对应

1. 修改系统时间 # tzselect Please select a continent, ocean, "coord", or "TZ".1) Africa2) Americas3) Antarctica4) Asia5) Atlantic Ocean6) Australia7) Europe8) Indian Ocean9) Pacific Ocean 10) coord - I want to use geographical coordina…

ubuntu20.04安装FLIR灰点相机BFS-PGE-16S2C-CS的ROS驱动

一、Spinnaker 安装 1.1Spinnaker 下载 下载地址为: https://www.teledynevisionsolutions.com/support/support-center/software-firmware-downloads/iis/spinnaker-sdk-download/spinnaker-sdk–download-files/?pnSpinnakerSDK&vnSpinnakerSDK 在上述地址中…

Windows配置JDK

1、解压 下载以后解压,放在一个没有中文路径和没有空格的目录,如下图: 2、配置Java环境 1)、点击左下角windows图标,输入huanjing(或者path),打开环境变量配置 如图: …

Unity教程(十八)战斗系统 攻击逻辑

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…

HCIP-HarmonyOS Application Developer 习题(二十三)

1、(多选)端云一体化已经集成以下哪些服务SDK。 A、云函数 B、云数据库 C、云存储 D、云托管 答案:AB 分析:云开发即为应用开发云侧工程,目前包含云函数与云数据库工程。 2、(多选)Entry下的m…

图数据库 | 5、图数据库三大组件之一 之 图计算 (下)

书接上文:图数据库 | 4、图数据库三大组件之一 ——图计算 (上)-CSDN博客 结合计算效率来评估与设计图计算所需的数据结构。 存储低效性或许是相邻矩阵或关联矩阵等数据结构的最大缺点,尽管它有着O(1)的访问时间复杂度。例如通过…

Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别

目录 一、概念 1、纹理过滤 2、邻近过滤 3、线性过滤 二、邻近过滤和线性过滤的区别 三、源码下载 一、概念 1、纹理过滤 当纹理被应用到三维物体上时,随着物体表面的形状和相机视角的变化,会导致纹理在渲染过程中出现一些问题,如锯齿…

【java】java通过s3访问ceph报错

1.报错信息、背景 工作中起了几个访问ceph的服务pod节点,一段时间后1个节点一直报错Unable to execute HTTP request: Timeout waiting for connection from pool,详细i信息如下图片,有且仅有1个节点报错,其他节点访问正常。看日志…

对于目标文件太大无法拉入u盘事件的解决方法

问题: 解决方法: 1.按住win r 键打开运行,输入cmd,点击确定。 2.输入convert 盘符(你自己的u盘的盘符): /fs:ntfs并单击回车