【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 的时候就自动分配内存空间(拿类类型实例化称为对象)

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

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


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

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

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

相关文章

解决表格出现滚动条样式错乱问题

自定义表格出现滚动条时,会因为宽度不对等导致样式错乱; 解决思路: 监听表格数据的变化,当表格出现滚动条时,再调用更新宽度的方法updateWidth,去改变表格头部的宽度,最终保持表格头部和内容对…

天才的懈怠 : 平衡二叉树

力扣110:平衡二叉树 描述: 二叉树的每一个节点的左右子树高度差不超过1,即为平衡二叉树 递归 树:还是用递归,从最深的节点开始向上判断,保证每个节点的左右子树高度差不大于1,大于1的用 -1 做标…

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包,而该项目的构建工具为 Webpack 或 Vite。同时,您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法,请随时留言。 安装 npm install three types/three react-three/fiber rea…

MySQL:CRUD

MySQL表的增删改查(操作的是表中的记录) CRUD(增删改查) C-Create新增R-Retrieve检查,查询U-Update更新D-Delete删除 新增(Create) 语法: 单行数据全列插入 insert into 表名[字段一,字段…

DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程

一、概述 【软件资源文件下载在文章最后】 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程 点餐软件以其实用的功能和简便的操作,为小型餐饮店提供了高效的点餐管理解决方案,提高了工作效率和服务质量 ‌点餐管理‌:支持电…

5G时代的关键元件:射频微波MLCCs市场前景广阔

根据QYResearch调研团队最新发布的《全球射频微波多层陶瓷电容器市场报告2023-2029》显示,预计到2029年,全球射频微波多层陶瓷电容器市场规模将攀升至12.4亿美元,其未来几年内的年复合增长率(CAGR)预计为5.1%。 以下图…

ElasticSearch学习笔记一:简单使用

一、前言 该系列的文章用于记录本人从0学习ES的过程,首先会对基本的使用进行讲解。本文默认已经安装了ES单机版本(当然后续也会有对应的笔记),且对ES已经有了相对的了解,闲话少叙,书开正文。 二、ES简介 …

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三:将AVFrame转换成AVPacket。视频编码原理.编码相关api

前提: 从前面的学习我们知道 AVFrame中是最原始的 视频数据,这一节开始我们需要将这个最原始的视频数据 压缩成 AVPacket数据, 我们前面,将YUV数据或者 RGBA 数据装进入了 AVFrame里面,并且在SDL中显示。 也就是说&…

ODOO学习笔记(8):模块化架构的优势

灵活性与可定制性 业务流程适配:企业的业务流程往往因行业、规模和管理方式等因素而各不相同。Odoo的模块化架构允许企业根据自身的具体业务流程,选择和组合不同的模块。例如,一家制造企业可以启用采购、库存、生产和销售模块,并通…

28.医院管理系统(基于springboot和vue)

目录 1.系统的受众说明 2. 相关技术和开发环境 2.1 相关技术 2.1.1 Java语言 2.1.2 HTML、CSS、JavaScript 2.1.3 Redis 2.1.4 MySQL 2.1.5 SSM框架 2.1.6 Vue.js 2.1.7 SpringBoot 2.2 开发环境 3. 系统分析 3.1 可行性分析 3.1.1 经济可行性 3.1.2 技术…

实时渲染技术如何助力3D虚拟展厅?

实时渲染技术以其强大的图形处理能力和即时反馈特性,在虚拟展厅的创建和体验中发挥着举足轻重的作用。视创云展3D虚拟展厅提供全方位的VR漫游体验,实时渲染技术确保场景细腻逼真,让访客仿佛置身其中,享受沉浸式的视听享受。以下是…

金价大跌,特朗普胜选或成导火索

黄金光芒不再,美元强势崛起 上周特朗普赢得美国总统选举后,金价出现了大幅下跌。这标志着市场情绪正在发生转变,投资者开始从避险资产转向风险资产。 为何金价会下跌? 美元走强: 特朗普的胜选提振了美元,…

springboot项目中,使用ProGuard 对代码进行混淆

springboot项目中&#xff0c;使用ProGuard 对代码进行混淆 使用maven作为构建工具 &#xff0c; 在build中添加如下内容 <build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</inclu…

[CKS] 关闭API凭据自动挂载

目前的所有题目为2024年10月后更新的最新题库&#xff0c;考试的k8s版本为1.31.1 BackGround 安全审计发现某个Deployment有不合规的服务账号令牌&#xff0c;这可能导致安全漏洞。 Task 首先&#xff0c;修改monitoring namespace中现有的stats-monitor-sa ServiceAccount&…

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…

Gsensor加速度传感器数据异常及概率性卡死

关注 点赞 收藏 不错过精彩内容 大家好&#xff0c;我是硬核王同学 今天给大家分享下&#xff0c;经过三个多月解决的Gsensor加速度传感器数据异常及概率性卡死的问题。 数据异常 故事的开始是来自一位客户的投诉&#xff0c;说机器放在桌面上不去动它&#xff0c;语音就会播…

【CSS】“flex: 1“有什么用?

flex 属性的组成 flex 属性是一个复合属性&#xff0c;包含以下三个子属性&#xff1a; flex-grow&#xff1a;决定元素在容器中剩余空间的分配比例。默认值为 0&#xff0c;表示元素不会扩展。当设置为正数时&#xff0c;元素会按照设定比例扩展。flex-shrink&#xff1a;决…

【STM32】基于SPI协议读写SD,详解!

文章目录 0 前言1 SD卡的种类和简介1.1 SD卡的种类1.2 SD卡的整体结构1.3 SD卡运行机制——指令和响应2 SD卡的通信总线2.1 SDIO2.2 SPI3 硬件连接4 代码实践【重点】4.1 HAL库移植4.2 标准库移植4.3 遇到的问题和解决方案5 扩展阅读0 前言 因为项目需要,使用stm32读写sd卡,这…

软件测试面试题(800道)【附带答案】持续更新...

&#xff08;2024版&#xff09;面经 详细笔记部分展示&#xff1a; 测试基础&#xff08;102页&#xff09; Linux基础&#xff08;38页&#xff09; MySQL&#xff08;63页&#xff09; web测试&#xff08;21页&#xff09; API测试&#xff08;46页&#xff09; APP测试&…