从零开始的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.mzph.cn/news/95657.shtml

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

相关文章

Django 模型层的操作(Django-05 )

一 模型层的解读 Django中内嵌了ORM框架,不需要直接编写SQL语句进行数据库操作,而是通过定义模型类,操作模型类来完成对数据库中表的增删改查和创建等操作。 O 是object,也就类对象的意思。R 是relation,翻译成中文是…

快手直播显示请求过快

快手直播显示请求过快 问题描述情况一问题描述原因分析解决方案:情况二问题描述解决方法问题描述 在使用快手直播网页版时,如果我们的请求过于频繁,系统可能无法及时显示所需内容。这种情况下,我们会收到一个稍后重试的提示。一般有两种情况。一种是直接返回一段json,里面…

图像和视频上传平台Share Me

本文完成于 6 月,所以反代中,域名演示还是使用的 laosu.ml,不过版本并没有什么变化; 什么是 Share Me ? Share Me 是使用 Next.js 和 PocketBase 的自托管图像和视频上传平台,具有丰富的嵌入支持和 API&…

【Qt基础篇】信号和槽

文章目录 一些常见的bug:字符集不对产生的错误VS平台中文乱码 QT的优点关于.pro文件QtCreator快捷键最简单的qt程序按钮的创建对象模型**Qt窗口坐标**体系信号和槽机制connect函数系统自带的信号和槽案例:实现点击按钮-关闭窗口的案例 自定义信号和槽案例…

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

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

好奇喵 | Tor浏览器——访问.onion网址,揭开Dark Web的神秘面纱

前言 在之前的博客中: 1.Surface Web —> Deep Web —> Dark Web,我们解释了表层网络、深层网络等的相关概念; 2.Tor浏览器——层层剥开洋葱,我们阐述了Tor的历史和基本工作原理; 3.Tor浏览器…

C#,数值计算——完全VEGAS编码的蒙特·卡洛计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Complete VEGAS Code /// adaptive/recursive Monte Carlo /// </summary> public abstract class VEGAS { const int NDMX 50; const int …

Linux CentOS7 vim寄存器

计算机中通常所说的寄存器Register一般指的是CPU中的寄存器&#xff0c;用来暂存CPU处理所需要的指令、数据等。 vim中同样也有寄存器&#xff0c;使用的方式和CPU非常类似。 vim中的寄存器(register)作用和windows中的剪切板类似&#xff0c;不过vim中的寄存器不止一个&…

解决WPF+Avalonia在openKylin系统下默认字体问题

一、openKylin简介 openKylin&#xff08;开放麒麟&#xff09; 社区是在开源、自愿、平等和协作的基础上&#xff0c;由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区&#xff0c;致力于通过开源、开放的社区合作&#xff…

IEEE802系列协议知识点总结

IEEE 802 协议包含了以下多种子协议。把这些协议汇集在一起就叫IEEE 802 协议集。 (1)IEEE802.1 IEEE 802.1协议提供高层标准的框架&#xff0c;包括端到端协议、网络互连、网络管理、路由选择、桥接和性能测量。 •IEEE 802.1d:生成树协议(Spanning Tree Protocol&#xff0c…

计算机专业毕业设计项目推荐12-志愿者管理系统(Spring+Js+Mysql)

志愿者管理系统&#xff08;SpringJsMysql&#xff09; **介绍****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&#xff0c;在编写的过程…

QT:鼠标画线(双画布)

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPoint> //点 #include <QMouseEvent> //鼠标事件 #include <QPaintEvent> //绘图事件class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent 0);~Wi…

汽车网络安全--安全芯片应用场景解析

​在聊汽车网络安全时,最先想到的就是使用芯片内置HSM,比如说英飞凌TC2xx系列的HSM、瑞萨RH850的ICU、NXP的HSE等等;实际上除了内置HSM,还有外置HSM(通过UART、SPI等通信)、安全存储芯片等等。而这些芯片统称为安全芯片。 安全芯片的主要作用是为整个系统建立起一个可信的…

IIS Application Pool

在连接字符串Connection string中&#xff0c;Pooling为是否启用连接池&#xff0c;默认值为Poolingtrue&#xff0c;表示启用。与连接池相关的两个重要参数是 Min Pool Size(默认值是0) 和 Max Pool Size (默認值為100&#xff0c;最大值为32767)&#xff0c;分别指池中的最小…

通过融合UGV的地图信息和IMU的惯性测量数据,实现对车辆精确位置和运动状态的估计和跟踪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

543. 二叉树的直径

题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,…

ChatGPT基础使用总结

文章目录 一、ChatGPT基础概念大型语言模型LLMs---一种能够以类似人类语言的方式“说话”的软件ChatGPT定义---OpenAI 研发的一款聊天机器人程序&#xff08;2022年GPT-3.5&#xff0c;属于大型语言模型&#xff09;ChatGPT4.0---OpenAI推出了GPT系列的最新模型ChatGPT典型使用…

FusionCharts Suite XT v3.21 Crack

FusionCharts Suite XT v3.21 在圆环图和饼图上将图例和数据值显示为百分比或绝对值。 2023 年 10 月 4 日 - 15:15新版本 特征 通过允许用户将图例和数据值显示为百分比或绝对值&#xff0c;改进了圆环图和饼图。 添加了一个新功能&#xff0c;可以删除任何可能导致代码错误的…

电脑数据恢复怎么操作?电脑数据恢复难点是什么

随着电脑在我们日常生活中的普及&#xff0c;数据的重要性不言而喻。然而&#xff0c;在某些情况下&#xff0c;我们可能会不小心删除或因其他原因导致丢失了重要的电脑数据&#xff0c;这时候就需要进行数据恢复操作。下面我们一起来了解下电脑数据恢复的操作方法&#xff0c;…

多媒体应用设计师

1.多媒体技术基础 1.1.媒体与技术 1.1.媒体 维基百科&#xff1a;传播信息载体 国际电信联盟&#xff08;ITU-T&#xff09;&#xff1a;感知、表示、存储和传输的手段和方法。 两层含义&#xff1a;存储信息的实体&#xff0c;媒质。传递信息载体&#xff0c;媒介。 1.2.国…