C++类与对象基础(8)

目录

1. 隐式类型转换与关键字explicit:

1.1 隐式类型转换举例:

1.2 explicit关键字:

2. 友元:

2.1 友元函数:

2.2 友元类:

3. 内部类:

4. 勘误:


1. 隐式类型转换与关键字explicit:

1.1 隐式类型转换举例:

首先列举一个最基本的隐式类型转换:

int i = 0;
double d = i;

       在上述给出的代码中,隐式类型转换发生在第二行,对于转换的具体过程需要注意,变量i并不是直接就转换类型为d,而是变量i会首先转换成一个具有常属性的中间变量,中间变量再进行一次转换,转换为变量d。对于上述代码,如果将const去掉,并不会直接影响代码的运行。但是,如果对上述代码进行更改:

int j = 0;double& b = j;

    运行代码,编译器报错如下所示:



   这是因为,引用,即&b所引用的并不是j,而是j在转换类型时,中途产生的具有常属性的中间变量。在加上const后,代码可以正常运行:

int j = 0;const double& b = j;

      上面所举出的例子都是针对内置内型而言,对于自定义类型,同样存在着隐式类型转换,例如对于下方给出的类:

class A
{
public:A( int i):_a(0) {};public:int _a = 0;
};

     通过这个类来建立两个对象:

int main()
{Test1();A d(1);A d1 = 3;return 0;
}

   第一种方法是常规的用于建立一个对象的方法,而第二种方法,在之前的文章中并没有进行过应用,因为可以看作用一个int类型来初始化一个自定义类型。这个过程便涉及了内置类型和自定义类型的隐式类型转换,其大体过程可以分为两个步骤,第一个步骤,内置类型3通过一次构造转换成一个A类型的中间变量,这个中间变量再通过一次拷贝构造来转换为变量d1

     需要注意,对于上述内置类型与自定义类型的隐式类型转换需要条件:类中存在单参数的构造函数

(注:并不只是单参数构造函数或者说这个定义并不绝对,在文章后段会对这个条件进行补充)

 同理,如果将上述代码进行更改为引用的形式,也需要加上const,即:

const A& d2 = 3;

   对于用于隐式类型转换的单参数构造函数,他的参数类型决定了可以被转换的参数类型,例如想让一个int*类型的变量转为自定义类型,则构造函数应该改为:
 

class A
{
public:explicit A( int* year):_a(0) {};public:int _a = 0;
};

       上面的注释中提到,内置类型与自定义类型发生隐式类型转换的条件是存在单参数构造函数这一定义并不绝对,例如,将上方代码的构造函数进行更改:

class A
{
public:A( int year, int month = 1, int day = 10):_a(0) {};public:int _a = 0;
};

可以看到,此时的构造函数有三各参数,但是其中两个参数都带有缺省值。

利用下方的代码建立对象:

A d1 = (2024, 1, 10);

       运行代码,编译器没有给出报错。可见,上面说的单参数并不是只有一个参数,对于多参数,如果只有一个参数需要进行传值,其他参数均有缺省值也可以进行。

      同样,假如构造函数的参数是全缺省,即:

class A
{
public:A( int year = 2024, int month = 1, int day = 10):_a(0) {};public:int _a = 0;
};

此时代码依旧可以正常运行。

为了更清晰的了解上述隐式类型转换的结果,给出下列代码并运行:
 

class A
{
public:A(int year = 2024, int month = 1, int day = 10): _year(year), _month(month), _day(day){};public:int _year;int _month;int _day;
};int main()
{A d1 = (2024, 1, 10);	return 0;
}

运行上述代码,通过监视区来查看自定义类型d1,即:

   产生这样结果的原因是在创建对象时,用于初始化的内容为:

(2024, 1, 10);	

  由逗号操作符的性质可以知道,上述内容的结果为最右端的数字,也就是说,对于创建对象的那行代码,可以改写为下面的形式:

A d1 = 10;

因此,产生了结果中第一个数字10,而后面的1,10,则是由构造函数的缺省参数来决定的 

1.2 explicit关键字:

    对于explicit关键字,其主要作用就是显示隐式类型转换的发生,其使用方法就是在构造函数的前面加上此关键字,即:

class A
{
public:explicit A( int year = 2024, int month = 1, int day = 10):_a(0) {};public:int _a = 0;
};

2. 友元:

2.1 友元函数:

        在之前关于流插入、流提取这两个运算符进行运算符重载的时候就提到过,由于这两个运算符在重载时,需要保证两个参数的顺序,因此,需要把此运算符重载作为全局函数而非成员函数,但是,成员函数在类中访问限定符为私有的情况下,全局函数不能访问成员变量,因此,需要采用友元的方式,让全局函数可以访问成员变量。

      对于友元函数的具体使用方法可以在C++类与对象基础(6)-CSDN博客进行查看,这里不再重复叙述

2.2 友元类:

 对于友元类,其大致的定义以及特点如下:
 1.友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
 2.友元关系是单向的,不具有交换性。
 3.比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问   Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
  友元关系不能传递
  4.如果C是B的友元, B是A的友元,则不能说明C时A的友元。
  5.友元关系不能继承,在继承位置再给大家详细介绍。

其使用方法与友元函数基本相同,这里也不进行过多叙述

3. 内部类:

   内部类就是在一个类中再定义一个类,具体由下面的代码给出:

class A
{
public:A(int a): _a(0){};class B{public:int _B;};
private:int _a;
};

 内部类和其他的类没有很大的区别,可以看作一个普通的类,但是受到了类A的类域以及访问限定符的限制。并且,对于一个内部类而言,就是外部类的一个友元类。

假如使用下面的代码来计算上面给出的代码的大小:

cout << sizeof(d1) << endl;

代码结果为:

可以看到,在计算类的大小时,不会计算内部类的大小。

4. 勘误:

  由于个人能力有限,书中难免出现汉字拼写错误、代码意义解释错误、内容逻辑以及理解错误等不同类型的错误。首先感谢各位大佬能花掉自己宝贵的时间阅读此文章,愿大佬们斧正,发现错误可以通过私信联系,本人不胜感激。

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

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

相关文章

网安入门12-文件上传(黑白名单,00截断)

黑名单绕过 Pass-03 有的时候后端限制了一些黑名单&#xff0c;比如过滤后缀名.php 我们就可以用黑名单里没有的后缀名进行绕过&#xff0c;例如&#xff1a; 大小写&#xff1a;.phP .pHp .AsPphp1 .php2 .php3 .php9 .phtml&#xff08;成功率较高&#xff09;特殊文件名绕…

使用kennycason.kumo.WordCloud For JAVA 制作词云图

官网&#xff1a;https://kennycason.com/posts/2014-07-03-kumo-wordcloud.html 一&#xff1a;添加POM文件 <!-- 词云 --><dependency><groupId>com.kennycason</groupId><artifactId>kumo-core</artifactId><version>1.27<…

CHS_01.1.4+操作系统体系结构 一

CHS_01.1.4操作系统体系结构 一 操作系统的体系结构 也就是操作系统的内核应该怎么设计这样一个问题操作系统的内核 在这个小节中 我们会学习 操作系统的体系结构 也就是操作系统的内核应该怎么设计这样一个问题 那这个小节的内容我们只需要做简要的了解就可以了 我们考试中常考…

Day3Qt

1. &#xff08;1&#xff09;完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 …

C++并发编程实战第2版笔记

文章目录 p19 某个线程只可以join()一次p22 只有当joinable()返回true时才能调用detach()P21 在std::thread对象析构前&#xff0c;必须明确是等待还是分离线程P25 移动语义P25 将类的成员函数设定为线程函数 p19 某个线程只可以join()一次 只要调用了join()&#xff0c;隶属于…

概述:利用大模型 (LLMs) 解决信息抽取任务

论文标题&#xff1a;Large Language Models for Generative Information Extraction: A Survey 论文链接&#xff1a;https://arxiv.org/pdf/2312.17617.pdf 论文主要探讨了大型语言模型&#xff08;LLMs&#xff09;在生成式信息抽取&#xff08;IE&#xff09;任务中的应用…

文献阅读1

A Hierarchical Representation Network for Accurate and Detailed Face Reconstruction from In-The-Wild Images 会议/期刊&#xff1a;CVPR 2023&#xff1b;阿里达摩院&#xff1b;Biwen Lei 概述&#xff1a;这是一篇单张图片三维人脸重建的论文&#xff0c;这篇论文的…

Android 事件分发介绍

文章目录 一、目的二、环境三、相关概念3.1 事件分发 四、详细设计4.1应用布局4.1.1 应用布局结构4.1.2 LayoutInspector 4.2 关键View&方法4.2.1 相关View4.2.2 相关方法4.2.3 View与方法关系 4.3 事件分发概念图4.3.1 事件分发类图4.3.2 事件分发模型图 4.4 Activity组件…

Federated Unlearning for On-Device Recommendation

WSDM 2023 CCF-B Federated Unlearning for On-Device Recommendation 本文工作的主要介绍 本文主要介绍了一种名为FRU&#xff08;Federated Recommendation Unlearning&#xff09;的联邦学习框架&#xff0c;用于在设备端的推荐系统中实现用户数据的有效擦除和模型重建。…

0x53 区间DP

0x53 区间DP 到目前为止&#xff0c;我们介绍的线性DP一般从初态开始&#xff0c;沿着阶段的扩张向某个方向递推&#xff0c;直至计算出目标状态。区间DP也属于线性DP中的一种&#xff0c;它以“区间长度”作为DP的“阶段”&#xff0c;使用两个坐标&#xff08;区间的左右端点…

Python-面向对象

面向对象 1.初识对象1.1理解使用对象完成数据组织的思路 2.成员方法2.1类的定义和使用语法2.2成员方法的使用 3.类和对象4.构造方法4.1使用构造方法向成员变量赋值 5.其他内置方法5.1__str__字符串方法5.2__lt__小于符号比较方法5.3__le__小于等于比较符号5.4__eq__比较运算符实…

VUE3相比VUE2升级了哪些内容

目录 一、Vue 3 、Vue 2 对比及提升项 二、 Vue 3 创建app.vue示例 三、Vue3 的setup、Vue2 的 data对比 一、Vue 3 、Vue 2 对比及提升项 性能提升&#xff1a;Vue 3 做了大量的优化工作&#xff0c;提升了运行时的性能。例如&#xff0c;在模板编译时进行的静态分析和优化…

如何把苹果手机中的备忘录导入到电脑?这种方法特别方便

作为苹果手机的忠实用户&#xff0c;我深知备忘录在日常生活中的重要性。它是我随手记下的灵感闪现&#xff0c;是工作会议的要点记录&#xff0c;更是生活中的小提醒和重要事务的备忘录。然而&#xff0c;有时我需要将这些信息从手机导入到电脑中&#xff0c;以便更方便地查看…

k8s的存储卷---数据卷

前言 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;重新启动。其…

【大数据OLAP引擎】StarRocks为什么快?

StarRocks的优势 StarRocks最初主要的优势是性能&#xff0c;当时在单表查询方面与性能标杆ClickHouse不相上下&#xff0c;而join优化特性使其在多表关联查询场景下的性能表现要远远优于ClickHouse&#xff0c;替换ClickHouse自然也就成了StarRocks的第一个目标。 而StarRoc…

three.js实现雷达扫描效果(纹理贴图)

three.js实现雷达扫描效果&#xff08;纹理贴图&#xff09; 图例 步骤 创建两个平面&#xff0c;分别纹理贴图&#xff0c;底图模型.add&#xff08;光波模型&#xff09;关闭材质的深度测试光波旋转 代码 <template><div class"app"><div ref&q…

【算法每日一练]-练习篇 #Tile Pattern #Swapping Puzzle # socks

目录 今日知识点&#xff1a; 二维前缀和 逆序对 袜子配对(感觉挺难的&#xff0c;又不知道说啥) Tile Pattern Swapping Puzzle socks Tile Pattern 331 题意&#xff1a;有一个10^9*10^9的方格。W表示白色方格&#xff0c;B表示黑色方格。每个(i,j)方的颜色由(i…

Unity真机Log工具 SRDebugger使用记录,GM布局管理

SRDebugger 官方文档安装及初始化常用设置选项布局选项快捷键选项高级设置 使用GM工具案例常用特性GM分组排序GM固定页签 官方文档 文档&#xff1a; https://www.stompyrobot.uk/tools/srdebugger/documentation/ 插件地址&#xff1a; https://assetstore.unity.com/package…

数据结构及单链表例题(下)

上次我们已经了解了单链表的数据结构定义以及创建单链表的两种方法,这节介绍几道例题. 文章目录 前言 一、已知L为带头结点的单链表,请依照递归思想实现下列运算 二、单链表访问第i个数据节点 三、在第i个元素前插入元素e 四、删除第i个结点 五、查找带头结点单链表倒数第…

TS 36.322 V12.0.0-过程

​本文的内容主要涉及TS 36.322&#xff0c;版本是C00&#xff0c;也就是V12.0.0。