从零开始的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…

建立HTTP代理IP池的技术和工具支持

建立HTTP代理IP池需要多种技术和工具支持&#xff0c;包括代理服务器、IP地址池、IP地址验证、数据库技术、网络安全技术、IP地址获取工具、IP地址验证工具、数据库管理工具、网络安全工具和自动化工具等。 代理服务器 代理服务器是HTTP代理IP池的核心组成部分&#xff0c;它可…

Flex布局详解

Flex布局详解 简介 Flex&#xff08;Flexible Box&#xff09;布局模型是一种高效且便于布局、对齐内容的一维布局模型&#xff0c;可用于解决复杂的布局挑战&#xff0c;特别适用于应用程序组件和小型布局。 基础概念 容器&#xff08;Container&#xff09;: 使用 displa…

IEEE802系列协议知识点总结

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

714.买卖股票的最佳时机含手续费

714. 买卖股票的最佳时机含手续费 - 力扣&#xff08;LeetCode&#xff09; 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&#xff0c;但是你每笔交易都需要付手续费。…

c# 正则表达式

正则表达式 是一种匹配输入文本的模式。.Net 框架提供了允许这种匹配的正则表达式引擎。模式由一个或多个字符、运算符和结构组成。 定义正则表达式 下面列出了用于定义正则表达式的各种类别的字符、运算符和结构。 字符转义字符类定位点分组构造限定符反向引用构造备用构造…

计算机专业毕业设计项目推荐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等通信)、安全存储芯片等等。而这些芯片统称为安全芯片。 安全芯片的主要作用是为整个系统建立起一个可信的…

PHP之redis 和 memache面试题

目录 1、什么是Redis&#xff1f;它的主要特点是什么&#xff1f; 2、redis数据类型 3、Redis的持久化机制有哪些&#xff1f;它们之间有什么区别&#xff1f; 4、Redis的主从复制是什么&#xff1f;如何配置Redis的主从复制&#xff1f; 5、Redis的集群模式是什么&#xf…

IIS Application Pool

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

Memtester框架是什么

Memtester 是一个用于测试系统内存稳定性和可靠性的工具。它可以模拟内存负载&#xff0c;并检查是否存在内存错误或故障。 安装 Memtester&#xff1a;在终端中运行适用于您的操作系统的安装命令&#xff0c;例如&#xff1a; 对于 Ubuntu 或 Debian&#xff1a; sudo apt-get…