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. 勘误:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子化以后如何申请软件著作权

​ 申请地址&#xff1a;中国版权登记业务平台 附件&#xff1a; 软件著作权设计说明书模板&#xff08;含填写说明&#xff09;.docx 软件著作权源程序模板.docx 软件著作权前期开发说明、合作开发协议、版本说明、法人证明、授权书模板.docx 注册、登录和实名认证 首先访问…

【echarts】雷达图参数详细介绍

1. 详细示例 var option {tooltip: {trigger: item},radar: {startAngle: 90,//第一个指示器轴的角度&#xff0c;默认90indicator: [// 指示器{ name: Category A, max: 220 },// name:指示器名称{ name: Category B, max: 200 },// max:指示器的最大值&#xff0c;可选&…

Nginx介绍与安装

目录 nginx服务 1、Nginx 介绍 2、为什么选择 nginx 3、IO多路复用 1、I/O multiplexing【多并发】 2、一个请求到来了&#xff0c;nginx使用epoll接收请求的过程是怎样的? 3、异步&#xff0c;非阻塞 4、nginx 的内部技术架构 5、yum安装部署nginx和配置管理 1.获取…

压测必经之路,Jmeter分布式压测教程

01、分布式压测原理 Jemter分布式压测是选择其中一台作为调度机&#xff08;master&#xff09;&#xff0c;其他机器作为执行机&#xff08;slave&#xff09;&#xff1b;当然一台机器也可以既做调度机&#xff0c;也做执行机。 调度机执行脚本的时候&#xff0c;master将会…

C++ 多态以及多态的原理

文章目录 多态的概念多态的构成条件虚函数的重写虚函数重写的两个例外 重载、重写(覆盖)、重定义(隐藏)对比C11 final 和 override关键字抽象类接口继承和普通继承多态的原理虚函数表多态的原理 单继承和多继承关系的虚函数表单继承中的虚函数表多继承中的虚函数表 多态的概念 …

C#实现个人账本管理系统

git地址&#xff1a;https://gitee.com/myshort-term/personal-ledger-management-system 1.系统简介 LedgerManagementSystem是一个小型的个人账本管理系统&#xff0c;可对收支项目进行增加、删除、修改、查询以及导入和导出。可对每日的各类收支项目进行汇总并查看和修改收…

vue3 ts defineProps、defineEmits、defineExpose、defineOptions、defineSlots

文章目录 前言一、defineProps二、defineEmits三、defineExpose四、defineOptions&#xff08; Vue3.3 新特性&#xff09;五、defineSlots(Vue3.3 新特性) 前言 本章我们来讲解vue3 ts 中 defineProps、defineEmits、defineExpose、defineOptions、defineSlots的使用及作用。 …

x-cmd pkg | you-get - web 媒体内容下载工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 You-Get 是一个开源的命令行小型下载工具&#xff0c;用于从各种网站下载视频、音频和其他媒体文件。 它可以解析和下载嵌套在网页中的媒体&#xff0c;能从 YouTube、优酷、Niconico 、bilibili 等热门网站下载视频、…

C++ vector模拟实现

C vector模拟实现 一.我们要实现的大致框架1.STL库中是如何实现的呢?1.迭代器2.成员变量3.vector的特性4.vector的成员变量大致情况 2.我们要实现的大致框架3.前言 二.具体实现1.迭代器,begin,end2.无参构造,析构,简单函数3.push_back4.reserve1.reserve的第一大坑点:野指针问…

React Native 桥接原生常量

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

电脑USB接口不同颜色的含义

当你看到笔记本电脑或台式机的USB端口时&#xff0c;你会发现USB端口的颜色很多&#xff1b;这些颜色可不只是为了好看&#xff0c;实际上不同颜色代表着不同的性能&#xff0c;那么这些带颜色的USB端口都是什么含义呢&#xff0c;下面就具体介绍下不同颜色代表的含义。-----吴…

钉钉逐浪AI Agent

文&#xff5c;郝 鑫 编&#xff5c;刘雨琦 “大公司代表落后生产力&#xff0c;是慢半拍的”&#xff0c;“小创新靠大厂&#xff0c;大创新仍然要靠小厂”&#xff0c;这是以李彦宏和王小川为代表的创业老炮&#xff0c;在2023年总结出来的创新规律&#xff0c;从移动互…

单片机原理及应用:中断嵌套

​中断嵌套是指中断系统正在执行一个中断服务时&#xff0c;有另一个优先级更高的中断提出中断请求&#xff0c;这时会暂时终止当前正在执行的级别较低的中断源的服务程序&#xff0c;去处理级别更高的中断源&#xff0c;待处理完毕&#xff0c;再返回到被中断了的中断服务程序…

阿里云的通义千问VS百度的文心一言~~

最近人工智能热度迅速升温&#xff0c;我体验了一下各大厂商的大模型的能力&#xff0c;发现他们确实很智能&#xff01; 我想问一下“南方小土豆”这个梗是如何火起来的&#xff0c;结果如下&#xff1a; 文心一言&#xff1a; 回答的比较准确&#xff0c;但有一些过于“官方”…

ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模进阶应用

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

vue知识-03

购物车案例 要实现的功能&#xff1a; 1、计算商品总价格 2、全选框和取消全选框 3、商品数量的增加和减少 <body> <div id"app"><div class"row"><div class"col-md-6 col-md-offset-3"><h1 class"text-center…

SpringCloudAlibaba微服务架构实战派上下册技术交流!

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

Springboot药物不良反应智能监测系统源码

一、系统简介 ADR指的是药品不良反应&#xff0c;即在合格药品在正常用法用量下&#xff0c;出现与用药目的无关或意外的有害反应。ADR数据辨别引擎、药品ADR信号主动监测引擎、ADR处置行为分析引擎。ADR数据辨别引擎&#xff0c;通过主动监测患者具象临床指标&#xff0c;比如…

Simpy简介:python仿真模拟库-03/5

一、说明 在过去的两篇文章中&#xff0c;我们了解了 simpy 的基础知识、声明变量和处理表达式。值得注意的例子包括评估导数和积分。现在&#xff0c;让我们继续使用函数。 二、SymPy — 函数类 SymPy 包包含 sympy.core.function 模块中的 Function 类。该类作为各种数学函数…

腾讯云优惠券介绍、领取方法及使用教程

腾讯云作为国内领先的云服务提供商&#xff0c;为了吸引更多的用户使用其产品&#xff0c;经常会推出各种优惠券活动。本文将详细介绍腾讯云的优惠券、领取方法和使用教程。 一、腾讯云优惠券介绍 腾讯云优惠券是腾讯云为了吸引用户使用其产品而推出的促销活动。用户可以通过领…