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

news2024/11/16 21:52:45

目录

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.coloradmin.cn/o/1372245.html

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

相关文章

DelayQueue原理探究

DelayQueue并发队列是一个无界阻塞延迟队列&#xff0c;队列中的每个元素都有个过期时间&#xff0c;当从队列获取元素时&#xff0c;只有过期元素才会出队列。队列头元素是最快要过期的元素。 DelayQueue类图结构 由该图可知&#xff0c;DelayQueue内部使用PriorityQueue存放…

【揭秘APT攻击】——内网渗透实战攻略,带你领略网络安全的绝密世界!

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 介绍 什么是内网&#xff1f; 什么是内网渗透&#xff1f; 内网渗透的目的&#xff1a; 内网…

Spring MVC 参数接收

参数接收 Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换器…

CSS3实现轮播效果

在我们不使用JS的情况下&#xff0c;是否也可以实现轮播功能呢&#xff1f; 答应是可以的 上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>轮播</title><style>.boss…

数据结构实验4:链表的基本操作

目录 一、实验目的 二、实验原理 1. 节点 2. 指针 3.链表的类型 3.1 单向链表 3.2 双向链表 3.3 单向循环链表 3.4 双向循环链表 4. 单链表的插入 4.1 头插法 4.2 尾插法 4.3 在指定位置插入元素 5. 单链表的删除 5.1 删除指定数值的节点 5.2 删除指定位置的节点 …

网络编程套接字(Socket)

文章目录 1 重点知识2 预备知识2.1 理解源IP地址和目的IP地址2.2 认识端口号2.3 理解 "端口号" 和 "进程ID"2.4 理解源端口号和目的端口号2.5 认识TCP协议2.6 认识UDP协议2.7 网络字节序 3 socket编程接口3.1 socket 常见API3.2 sockaddr结构 4 简单的UDP网…

statsmodels.tsa 笔记 detrend(去趋势)

1 基本使用方法 statsmodels.tsa.tsatools.detrend(x, order1, axis0) 2 参数说明 x数据。如果是二维数组&#xff0c;那么每一行或每一列将独立地去除趋势&#xff0c;但趋势的阶数是一样的。order趋势的多项式阶数。0 表示常数趋势&#xff08;即没有趋势&#xff09;&…

redis可视化工具 RedisInsight

redis可视化工具 RedisInsight 1、RedisInsight是什么2、下载RedisInsight3、使用RedisInsight4、其他redsi可视化工具 1、RedisInsight是什么 RedisInsight 是一个用于管理和监控 Redis 数据库的图形用户界面&#xff08;GUI&#xff09;工具。它是由 Redis Labs 开发的&…

React Native 桥接原生常量

一、编写并注册原生常量方法 在 SmallDaysAppModule 这个模块中有一个方法 getConstans &#xff0c;重载这个方法就可将自定义的常量返回&#xff0c;系统会自行调用该方法并返回定义的常量将其直接注入到 JS 层&#xff0c;在 JS 层直接获取即可。 二、JS 层获取原生常量&am…

YOLOv8 损失函数改进 | 引入 Shape-IoU 考虑边框形状与尺度的度量

🗝️改进YOLOv8注意力系列一:结合ACmix、Biformer、BAM注意力机制 论文讲解加入代码本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者可以获取到注意力加入的代码和使用经验,总…

【ECShop电子商务系统__软件测试作业】ECSHOP系统搭建文档+接口测试用例+接口文档+接口测试脚本

一、选题题目可选《ECShop电子商务系统》、《EPShop电子商城系统》或者自选其它的开源系统(至少有十个以上的功能模块的系统&#xff0c;不得选功能少、简单的系统)。 软件测试作业 说明:接口测试相关资料 二、具体要求 1、搭建测试系统并写出搭建被测系统的全过程。 2、根…

Pure Mathematics 3-(磨课课件)-反三角函数求导(更新中)

6.6 Differentiating trigonometric functions&#xff08;反三角函数求导&#xff09; Edexcel Pure Mathematics 3(2018版本教材) /-------------------------------------------------------------------------------------------------------------------- Prior Knowledge…

Python实现PDF—>Excel的自动批量转换(附完整代码)

Python实现PDF—>Excel的自动批量转换&#xff08;附完整代码&#xff09; 话不多说&#xff0c;先看效果&#xff01; 需要转换的PDF&#xff1a; 转换后的Excel&#xff1a; 01、底层原理 PDF 到 Excel 的转换涉及不同文件格式之间的数据提取和重构。底层原理可以简…

抖音小程序+乔拓云教育系统:让课程销售飞起来

随着数字媒体的迅猛发展&#xff0c;抖音已经成为了一个广受欢迎的社交平台。而当抖音遇上教育&#xff0c;一场全新的学习革命就此展开。特别是借助乔拓云教育系统&#xff0c;培训班可以轻松地开启抖音营销之旅&#xff0c;将优质课程带给更多潜在学员。 乔拓云教育系统作为一…

【Spring Boot】SpringMVC入门

1.什么是springMVC MVC就是把一个项目分成了三部分&#xff1a; MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变&#xff1a; 当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页…

【python基础】一文搞懂:Python 中轻量型数据库 SQLite3 的用法

一文搞懂&#xff1a;Python 中轻量型数据库 SQLite3 的用法 文章目录 一文搞懂&#xff1a;Python 中轻量型数据库 SQLite3 的用法1 引言2 SQLite3 简介3 基本步骤4 示例代码4.1 连接数据库4.2 创建表4.3 插入数据4.4 查询数据4.5 更新/删除数据4.6 关闭数据库连接 5 实例演示…

作业--day44

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

Win10下python3和python2同时安装并解决pip共存问题

特别说明&#xff0c;本文是在Windows64位系统下进行的&#xff0c;32位系统请下载相应版本的安装包&#xff0c;安装方法类似。 使用python开发&#xff0c;环境有Python2和 python3 两种&#xff0c;有时候需要两种环境切换使用&#xff0c;下面提供详细教程一份。 1、下载…

MySQL之导入、导出远程备份

一、Navicat工具导入、导出 1.1 导入 第一步&#xff1a; 右键&#xff0c;点击运行SQL文件 第二步&#xff1a; 选择要运行的SQL&#xff0c;点击开始 第三步&#xff1a; 关闭即可 1.2 导出 第一步&#xff1a; 右键选择&#xff0c;导出向导 第二步&#xff1a; 选择SQL脚…

QT开发 QT5.15.2安装(换源极速安装)

▬▬▬▬▬▶QT安装◀▬▬▬▬▬ &#x1f384;QT下载器获取 点我下载(●’◡’●) &#x1f384;下载器放自定义文件夹(路径全英文) 文件名改短好操作 &#x1f384;在自定路径唤出cmd窗口 &#x1f384;输入命令开始换源安装 ins.exe --mirror https://mirrors.ustc.ed…