从零开始的C++(五)

news2024/10/5 19:14:07

1.类和对象的补充

当对象是const修饰的常量时,形参中的this是隐含的,那么该如何写函数才能传常量对象呢?如果还是按照正常的方式写,则会出现实参是const修饰的,形参没有,出现了权限的扩大,无法使用。因此需要在括号和大括号之间加一个const,这个const是专门修饰this指针的。

如上图的d1是const修饰的,调用d1的成员函数print,print加了一个const修饰this指针。

如果把const放函数最前面,则const修饰的是函数的返回值,但由于函数的返回值一般会经过一次拷贝拷贝到一个临时常量,在把这个临时常量赋值给实际接受的变量,而临时常量具有常性,因此加与不加const此时无影响。但有一种情况下前面加const会有影响,就是返回的是引用,此时不会拷贝返回值到一个临时常量,而const此时的作用是使得返回的那个变量无法被修改。

const修饰this指针的时候,与不加const修饰this指针构成了函数重载,此时非const修饰的对象两个函数都可以调用,const修饰的只能调用有const的函数。但如果有和没有const修饰的函数均有,非const修饰的对象会调用哪一个?答案是调用更适配的那个,即非const优先调用没有const的函数,如果只有有const的函数,则也可以调用有const的函数。

const修饰this指针,此时const的作用只有对象的成员,但如果对象的成员有指针,此时修改指针指向的对象的值是可以的,但一般根据逻辑上我们是不希望可以修改的,所以此时对返回值加const可以起到作用。

总结一下上文,一般不希望形参被修改的时候,会加一个const修饰this指针,例如比较大小的运算符重载往往需要加const。

2.默认成员函数:

取地址运算符:不写的时候编译器会默认生成一个,作用是取首地址。可以进行运算符重载。重载的有const修饰this和非const修饰this的两种。一般用不到,只有在不希望地址被获取的时候才用。

3.类外调用私有成员的方法:

友元函数:非成员函数,但需要把函数声明放在类声明里,并在函数声明最前面加一个friend,声明其是友元函数,此时函数可以调用类内的私有成员。

4。流插入和流删除:

流(stream),做输入和输出的中转站,通过重载流插入和流删除的运算法,可以实现cout、cin跟自定义类型的对象。

请注意,重载这两个函数不能做成员函数,因为成员函数的第一个参数一定是this指针,不符合此处的顺序(即此处第一个参数应该是流,第二个参数才是对象),而在类外需要调用私有成员的时候就需要声明友元函数,所以此处重载的两个函数均是友元函数。考虑到连续调用该运算符的情况,所以函数的返回类型是流的引用。

5.初始化列表:

形式:以冒号开始,逗号分隔,每个成员变量后跟一个括号,括号内是要赋的初值。

此处对_year、_day进行了初始化列表,实现了把year赋给_year,day赋给_day.

本质:对所有的对象成员进行定义的地方(注意所有和定义),如果初始化列表里没有该对象成员,则相当于赋了随机值。

当成员是const修饰的或者是引用的时候,必须用初始化列表,因为const和引用需要在定义阶段初始化赋值。但需要注意static修饰的不用,因为静态的要在类外初始化。所以static修饰的const类型的不一定要用初始化列表。(注意此处是不一定不是不能!)

自定义类型的对象做成员的时候,可以在初始化列表里进行带参数的拷贝。

初始化列表可以不写,此时内置类型不处理,自定义类型调用默认构造函数。初始化列表也可以只写一部分成员变量。

声明阶段的缺省值实质就是写初始化列表,此时如果初始化列表没有该变量,则调用缺省值。同时,初始胡列表的实际调用顺序就是变量的声明顺序(此时需要注意,有时候在初始化列表中将一个成员变量赋给另一个成员变量时,需要考虑两个变量的声明顺序,不然可能会出现还是随机值的时候就把变量赋给另一个变量了)。

初始化列表中每个成员只能出现一次。

自定义类型的成员会强制去初始化列表中调用,此时初始化列表有则调用值拷贝,没有则调用默认拷贝。

6:单参数的构造函数隐式类型转换(注意成员只能有一个!!)

形如 “类名 对象名=内置类型的值”,此处是先将内置类型的拷贝赋值给一个与对象同类型的临时变量,在用拷贝构造把临时变量赋给对象。但在编译器中优化成了一步直接拷贝。

如果d1是引用类型则必须加const,因为临时变量具有常性。

隐式转换的好处:可以不用先用值拷贝的方式创建一个对象,在把这个对象拷贝赋值给另一个对象,写起来更加方便。

如果d1中有多个参数,则等号右侧的参数用"{}"括起来,用逗号分隔。

匿名对象:

形如类名(值),生命周期只有一行,一般用于赋值时化简。

总结:本篇补充了类和对象,介绍了取地址运算符的重载、初始化列表、流插入和流删除、友元函数、单参数隐式类型转换、匿名对象。

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

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

相关文章

基于卷积神经网络的法线贴图生成器

在本文中,我们将学习如何训练卷积神经网络从彩色图像生成法线贴图。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 1、数据和工具 我们正着手训练神经网络从彩色图像生成法线贴图。 我们将以“成对”的方式做到这一点。 这意味着我们将显示相应图像的网络对…

程序人生 / 散文分享 / 生活感悟——【追光的日子】《爷爷的12本日历》,若你也共情,欢迎在评论区分享你的故事、观点、感悟和思考!

在一切变好之前,我们总要经历一些不开心的日子,这段日子也许很长,也许只是一觉醒来。有时候,选择快乐,更需要勇气。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3]…

Spring Cloud OpenFeign 性能优化的4个方法

OpenFeign 是 Spring 官方推出的一种声明式服务调用和负载均衡组件。它的出现就是为了替代已经进入停更维护状态的 Netflix Feign,是目前微服务间请求的常用通讯组件。 1.超时设置 OpenFeign 底层依赖Ribbon 框架,并且使用了 Ribbon 的请求连接超时时间…

打表找规律与分析判断:ARC144C

https://atcoder.jp/contests/arc144/tasks/arc144_c?langen 一开始我猜的结论是前后 k k k 个预处理,中间贪心。 通过打表: 可以发现是前面 2 k 2k 2k 连续块直接暴配,最后一段再用我想的贪心。 究其原因,其实是我们本质上…

安卓开发中遇到的奇奇怪怪的问题(四)

好久没有写这个系列了,感觉还是需要把日常开发中遇到的问题做一个记录总结,因为有些问题我当时遇到时,搜都搜不到,只能慢慢摸索。帮助他人的同时也能给自己留个备忘录。话不多说,凡是近一年的奇怪问题,我想…

Rust中的枚举和模式匹配

专栏简介:本专栏作为Rust语言的入门级的文章,目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言,虽然历史没有C、和python历史悠远,但是它的优点可以说是非常的多,既继承了C运行速度,还拥有了Java…

24 mysql all 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

【网络】路由器和交换机的区别

🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁 🦄 个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的帮助&#x1…

小谈设计模式(21)—迭代器模式

小谈设计模式(21)—迭代器模式 专栏介绍专栏地址专栏介绍 迭代器模式对象分析聚合对象(Aggregate)迭代器对象(Iterator) Java程序示例程序分析12 优缺点分析优点简化了聚合对象的接口统一的遍历方式增加了代…

20秒基于Chat GPT完成工作中的小程序

1. 写在前面 GPT自从去年爆发以来,各大公司在大模型方面持续发力,行业大模型也如雨后春笋一般发展迅速,日常工作中比较多的应用场景还是问答模式,作为写程序的辅助也偶尔使用。今天看到一篇翻译的博客“我用 ChatGPT,…

更新Xcode 版本后运行项目出现错误 Unable to boot the Simulator 解决方法

错误截图 出现 Unable to boot the Simulator 错误原因很多,以下方法不一定都适用,我是通过以下方法解决的 打开命令终端输入以下命令,可能需要你输入开机密码 sudo rm -rf ~/Library/Developer/CoreSimulator/Caches

Android---字节码层面分析Class类文件

Java 提供了一种可以在所有平台上都能使用的一种中间代码---字节码文件(.class文件)。有了字节码,无论是那个平台只要安装了虚拟机都可以直接运行字节码文件。有了虚拟机,解除了 java 虚拟机与 java 代码之间的耦合。 Java 虚拟机当初被设计出来时就不单…

【设计模式】访问者模式

文章目录 1.访问者模式定义2.访问者模式的角色3.访问者模式实战案例3.1.场景说明3.2.UML类图3.3.代码实现 4.访问者模式优缺点5.访问者模式适用场景6.访问者模式总结 主页传送门:💁 传送 1.访问者模式定义 访问者模式(Visitor Pattern&#x…

【MATLAB源码-第43期】基于matlab的turbo码误码率仿真比较不同迭代次数,采用logmap/sova算法。

操作环境: MATLAB 2022a 1、算法描述 Turbo码是一种前向纠错码 (Forward Error Correction, FEC),在 1993 年由法国的两位研究员 Claude Berrou 和 Alain Glavieux 提出。这种编码技术以其接近 Shannon 极限的高性能而受到广泛关注。以下是关于 Turbo…

黑马JVM总结(二十六)

(1)异常-catch 下面看一下字节码里面怎么做异常的处理 (2)异常-多个catch astore_2:就是把异常对象的地址存到局部变量表2号曹位上 (3)异常-multicatch (4)异常-finally &#xff0…

uniapp 实现地图头像上的水波纹效果

最近实现了uniapp 地图头像水波纹的效果,话不多说,先来看看视频效果吧:链接 在这里具体的代码就不放出来了,还是利用了uniapp的 uni.createAnimation 方法,因为cover-view 不支持一些css 的动画效果,所以这…

探秘布隆过滤器:高效数据查找与去重利器

探秘布隆过滤器:高效数据查找与去重利器 引言 在现代计算机科学中,数据的查找与去重是一个至关重要的问题。本文将介绍一种高效的数据结构——布隆过滤器,它能够在海量数据中快速判断某个元素是否存在,同时具有出色的空间效率。…

动态调整系统主题色(4): CssVar 与 Variant 方案的探索

动态调整系统主题色(4): CssVar 与 Variant 方案的探索 动态调整系统主题色(4): CssVar 与 Variant 方案的探索 前言方案的介绍与比较 CssVar (CSS 变量方案)CSS 变量方案与 tailwindcss 的结合Variant 方案 2种方案在小程序上的示例之前的几篇 前言 这篇已经是动态调整系统…

深度学习模型部署与优化:策略与实践;L40S与A100、H100的对比分析

★深度学习、机器学习、生成式AI、深度神经网络、抽象学习、Seq2Seq、VAE、GAN、GPT、BERT、预训练语言模型、Transformer、ChatGPT、GenAI、多模态大模型、视觉大模型、TensorFlow、PyTorch、Batchnorm、Scale、Crop算子、L40S、A100、H100、A800、H800 随着生成式AI应用的迅猛…

python打开浏览器并模拟搜索

打开已存在的浏览器 打开已存在的浏览器有个很重要的作用就是,可以对于一些登录场景,提前登录好,不需要模拟登录了。 在命令行中执行打开chrome的命令,在图标上找到chrome的安装位置 在cmd命令行下执行命令 C:\Program Files\…