从零开始的C++(五)

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.rhkb.cn/news/149319.html

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

相关文章

开发工具箱 —— it-tools

文章目录 开发工具箱 —— it-tools安装访问效果 开发工具箱 —— it-tools 安装 docker 安装教程:在 CentOs7 中安装宝塔面板和 Docker(包括MySQL,Redis) docker 安装命令 docker run -d --name it-tools --restart unless-st…

012-第二代硬件选型

第二代硬件选型 文章目录 第二代硬件选型项目介绍重新换平台缘由X86 && Arm 架构切换 ARM Linux 硬件选型系统确定Qt 版本确定总结一下 关键字: Qt、 Qml、 Arm、 X86、 linux 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QM…

浏览器技巧:谷歌浏览器六个实用设置小技巧,值得收藏

目录 1、确保你的浏览器启用标准保护选项 2、使用安全DNS(DNS over HTTPS) 3、网站通知修改为"静态指示方式" 4、启用页面预加载提升网页加载速度 5、阻止Chrome浏览器在后台运行 6. 更改 Chrome 启动后打开方式为"上次打开的网页&…

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

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

如何搭建一个 websocket

环境: NodeJssocket.io 4.7.2 安装依赖 yarn add socket.io创建服务器 引入文件 特别注意: 涉及到 colors 的代码,请采取 console.log() 打印 // 基础老三样 import http from "http"; import fs from "fs"; import { Server } from &quo…

安装NodeJS并使用yarn下载前端依赖

文章目录 1、安装NodeJS1.1 下载NodeJS安装包1.2 解压并配置NodeJS1.3 验证是否安装成功2、使用yarn下载前端依赖2.1 安装yarn2.2 使用yarn下载前端依赖参考目标:在Windows下安装新版NodeJS,并使用yarn下载前端依赖,实现运行前端项目。 1、安装NodeJS 1.1 下载NodeJS安装包…

面试题:Redis和MySQL的事务区别是什么?

大家好,我是小米!今天我要和大家聊聊一个在技术面试中经常被问到的问题:“Redis和MySQL的事务区别是什么?”这个问题看似简单,但实际上涉及到了数据库和缓存两个不同领域的知识,让我们一起来深入了解一下吧…

阿里云ECS和轻量服务器有什么区别?

阿里云服务器ECS和轻量应用服务器有什么区别?轻量和ECS优缺点对比,云服务器ECS是明星级云产品,适合企业专业级的使用场景,轻量应用服务器是在ECS的基础上推出的轻量级云服务器,适合个人开发者单机应用访问量不高的网站…

FFmpeg:打印音/视频信息(Meta信息)

多媒体文件基本概念 多媒体文件其实是个容器在容器里面有很多流(Stream/Track)每种流是由不同的编码器编码的从流中读出的数据称为包在一个包中包含着一个或多个帧 几个重要的结构体 AVFormatContextAVStreamAVPacket FFmpeg操作流数据的基本步骤 打印音/视频信息(Meta信息…

模糊搜索利器:Python的thefuzz模块详解

文章目录 thefuzz模块简介thefuzz模块的参数和方法使用thefuzz实现模糊搜索在Python中,thefuzz模块是一个用于实现模糊搜索的强大工具。它可以帮助我们在处理字符串时,快速找到相似的匹配项。本文将详细介绍thefuzz模块的功能和用法,并结合代码示例演示如何实现模糊搜索。 t…

pyqt5使用经验总结

pyqt5环境配置注意: 安装pyqt5 pip install PyQt5 pyqt5-tools 环境变量-创建变量名: 健名:QT_QPA_PLATFORM_PLUGIN_PATH 值为:Lib\site-packages\PyQt5\Qt\plugins pyqt5经验2: 使用designer.exe进行设计&#xff1…

三、【色彩模式与颜色填充】

文章目录 Photoshop常用的几种颜色模式包括:1. RGB模式2. CMYK模式3. 灰度模式4. LAB模式5. 多通道模式 Photoshop颜色填充1.色彩基础2.拾色器认识3.颜色填充最后附上流程图: Photoshop常用的几种颜色模式包括: 1. RGB模式 详细可参考&…

高速公路堵车动力学

S/t trace 图可以分析牛顿力学时间序列的一切。 下例分析了当车距太小时,一个轻微的刹车扰动如何触发大堵车的: 堵车由以下因素促成: 刹车反应时间,刹车反应很快,看见灯即可,即使这样越往后刹车必须越狠&…

基于混合蛙跳优化的BP神经网络(分类应用) - 附代码

基于混合蛙跳优化的BP神经网络(分类应用) - 附代码 文章目录 基于混合蛙跳优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.混合蛙跳优化BP神经网络3.1 BP神经网络参数设置3.2 混合蛙跳算法应用 4.测试结果…

lv7 嵌入式开发-网络编程开发 12 IP协议与ethernet协议

目录 1 IP协议作用和意义 2 IP数据报首部格式 3 IP数据报分片 4 以太网协议作用和意义(链路层) 5 练习 1 IP协议作用和意义 IP网的意义 当互联网上的主机进行通信时,就好像在一个网络上通信一样,看不见互连的各具体的网络异…

基于Matlab求解高教社杯数学建模竞赛(cumcm2010A题)-储油罐的变位识别与罐容表标定(附上源码+数据+题目)

文章目录 题目解题源码数据下载 题目 通常加油站都有若干个储存燃油的地下储油罐,并且一般都有与之配套的“油位计量管理系统”,采用流量计和油位计来测量进/出油量与罐内油位高度等数据,通过预先标定的罐容表(即罐内油位高度与储…

Vue中如何进行分布式搜索与全文搜索(如Elasticsearch)

在Vue中实现分布式搜索与全文搜索(使用Elasticsearch) 分布式搜索和全文搜索在现代应用程序中变得越来越重要,因为它们可以帮助用户快速查找和检索大量数据。Elasticsearch是一种强大的分布式搜索引擎,它可以用于实现高性能的全文…

Windows系统上使用CLion远程开发Linux程序

CLion远程开发Linux程序 情景说明Ubuntu配置CLion配置同步 情景说明 在Windows系统上使用CLion开发Linux程序,安装CLion集成化开发环境时会自动安装cmake、mingw,代码提示功能也比较友好。 但是在socket开发时,包含sys/socket.h头文件时&am…

基于SSM的医院预约挂号管理系统

基于SSM的医院预约挂号管理系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台界面 登录界面 管理员界面 医生界面 摘要 医院预约挂号管理系统是现代医疗…

调试器通用波形显示工具

前言:事情起因是我们实验室买了个无线调试器是CMSIS-DAP的,无法使用J-SCOPE显示波形来方便调PID,所以我就在网上找到了个开源工具链接:http://t.csdnimg.cn/ZqZPY使用方法:工具是好工具,就是没有使用手册&a…