当前位置: 首页 > article >正文

C++ ——— 单/多参数构造函数的隐式类型转换和 explicit 关键字

单参数构造函数

代码演示:

class A
{
public:
	A(int i)
		:_a(i)
	{}

private:
	int _a;
};

在 A 这个类中的构造函数只有一个参数,这就称之为单参数的构造函数


不同形式实例化对象

代码演示:

A a1(1);

A a2 = 2;

a1 的实例化过程:

第一个实例化对象 a1 是直接调用构造函数进行初始化的

a2 的实例化过程:

而第二个实例化对象 a2 是常量 2 调用构造函数生成一个临时对象,再用这个临时对象拷贝构造 a2 进行初始化的

但是编译器会对以上过程进行优化,优化为用 2 这个常量直接构造


验证 a2 是否是直接构造

代码演示:

class A
{
public:
	// 构造
	A(int i)
		:_a(i)
	{
		cout << "A(int i)" << endl;
	}

	// 拷贝构造
	A(const A& a)
		:_a(a._a)
	{
		cout << "A(const A& a)" << endl;
	}

private:
	int _a;
};

对构造函数和拷贝构造函数都加上打印,看是否打印了拷贝构造就能知道 a2 是否是直接构造

代码验证:

可以看出,实例化 a1 和 a2 时都只调用了构造函数,并没有调用拷贝构造函数


explicit 关键字

关键字的作用是阻止隐式类型转换,这个关键字一般添加在构造函数的开始

代码演示:

explicit A(int i)
	:_a(i)
{
	cout << "A(int i)" << endl;
}

加上 explicit 关键字后,让常量2直接拷贝 a2 就不支持了


多参数拷贝函数的隐式类型转换

代码演示:

class A
{
public:
	// 构造
	A(int i,int k)
		:_a1(i)
		,_a2(k)
	{
		cout << "A(int i,int k)" << endl;
	}

private:
	int _a1;
	int _a2;
};

在 A 这个类中有两个成员变量,构造函数的参数中也是两个,所以是多参数的拷贝函数

那么多参数拷贝函数如何隐式类型转换

代码演示:

A a1(1, 2);

A a2 = { 1,2 };

可以像 a1 一样直接调用拷贝构造函数实例化

也可以像 a2 一样通过隐式类型准换实例化,但是不能用小括号括起来,要用大括号才可以

代码验证:

可以看到,和单参数构造函数一样,优化成了直接构造 


http://www.kler.cn/a/459494.html

相关文章:

  • Tailwind CSS 实战:表单设计与验证实现
  • 网工日记:FTP两种工作模式的区别
  • 数字化供应链创新解决方案在零售行业的应用研究——以开源AI智能名片S2B2C商城小程序为例
  • C++ 面向对象编程:多态、虚函数原理
  • [极客大挑战 2019]Http 1
  • xadmin后台首页增加一个导入数据按钮
  • Prompt Engineering:提示词工程最佳实践与应用
  • DPIN基金会在曼谷发布全球去中心化GPU算力网络计划
  • Pip 简介与工作原理技术分享
  • 比分网站开发全流程/快速搭建比分网直播站/用现代技术实现高效架构
  • 什么是 PyPI(Python Package Index,Python 包索引)?
  • 面试经典150题——数组/字符串(三)
  • 自研国产零依赖前端UI框架实战006 实现表格分页的功能
  • 解决PS 撤销卡顿
  • 【 CSS 】sass 扩展语言的安装
  • IPC$远程植入木马
  • 【YashanDB知识库】yasql / as sysdba无法登录
  • Java设置服务器图片
  • Java-36 深入浅出 Spring - IoC容器体系 BeanFactory过程分析 Bean Lazy-Init
  • Spring Boot集成Netty创建一个TCP服务器,接收16进制数据(自定义解码器和编码器)
  • 纯血鸿蒙ArkUI线性布局详解
  • 【Vue 教程】使用 Vite 快速搭建前端工程化
  • Go singleflight库源码分析
  • 2.阿里云flinkselectdb-jar作业
  • 【React】- 跨域PDF预览、下载(改文件名)、打印
  • Flink如何处理迟到数据?