C++之explicit的作用介绍

article/2025/9/17 0:41:17

1、C++中的关键字explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。类构造函数默认情况下声明为隐式的即implicit。隐式转换即是可以由单个实参来调用的构造函数定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。

2、explicit关键字只能用于类内部的构造函数声明上,而不能用在类外部的函数定义(函数实现)上,它的作用是不能进行隐式转换;explicit关键字作用于单个参数的构造函数,如果构造函数有多个参数,但是从第二个参数开始,如果各参数均有默认赋值,也可以应用explicit关键字。

3、 当构造函数只有一个参数时,会进行自动隐式转换,当构造函数参数个数超过或等于两个时自动取消隐式转换,当只有一个必须输入的参数,其余的为有默认值的参数时使用explicit也起作用。

4、一般只将有单个参数的构造函数声明为explicit,而拷贝构造函数不要声明为explicit。explicit关键字只能对用户自己定义的对象起作用,不对默认构造函数起作用。此关键只能够修饰构造函数。无参数的构造函数和多参数的构造函数总是显示调用,这种情况在构造函数前加explicit无意义。

5、当不希望进行自动类型转换时用explicit,标准库的许多构造函数都是explicit的。

我们通过例子来直观的说明:

#include <iostream>
using namespace std;class A
{
public:A(int i = 5){m_a = i;}
private:int m_a;
};int main()
{A s;//我们会发现,我们没有重载'='运算符,但是却可以把内置的int类型赋值给了对象A.s = 10;//实际上,10被隐式转换成了下面的形式,所以才能这样.//s = A temp(10);system("pause");return 0;
}

此时,我们发现s的成员变量m_a已将被更改了。
大胡子的艾娃
看看我们在类A的构造函数前加上explicit关键字会发生什么。

#include <iostream>
using namespace std;class A
{
public://这里用explicit关键词来修饰类构造函数.explicit A(int i = 5, int j = 10){m_a = i;m_b = j;}
private:int m_a;int m_b;
};int main()
{A s;//这样直接赋值,会被提示错误,因为explicit抑制隐式转换的进行s = 10;//这样会报错!!!//当然显示转换还是可以的.s = A(20);system("pause");return 0;
}

再来看一个例子。

#include <iostream>
using namespace std;
class Test1
{
public :Test1(int num):n(num){}
private:int n;
};
class Test2
{
public :explicit Test2(int num):n(num){}
private:int n;
};int main()
{Test1 t1 = 12;Test2 t2(13);Test2 t3 = 14;return 0;
}

编译时t3那一行会报错:提示:无法从“int”转化为“Test2”。注释掉t3那一行,t1能编译通过,调试时发现t1中的成员变量n已被赋值成功。

通过以上两个例子我们可得:对于仅有一个参数或除第一个参数外其余参数均有默认值的类构造函数,尽可能使用explicit关键字修饰。
另注意:当类的构造函数的声明和定义分别在两个文件里时,explicit只能写在构造函数的声明中,不能写在定义中。

如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810


http://chatgpt.dhexx.cn/article/rwViI62B.shtml

相关文章

explicit关键字详解

在C中&#xff0c;explicit关键字用来修饰类的构造函数&#xff0c;被explicit修饰的类的构造函数&#xff0c;不能发生相应的隐式类型转换&#xff0c;只能以显示的方式进行类型转换。 explicit使用注意事项: explicit 关键字只能用于类内部的构造函数声明上。 explicit 关…

74HC244;74HCT244——三态八路缓冲器/线路驱动器

1.特点&#xff1a; 2.引脚及封装&#xff1a; 3.引脚定义&#xff1a; 解释&#xff1a; output enable input (active LOW)输出使能&#xff0c;低电平有效 data input&#xff1a;数据输入 bus output:总线输出 4.使用逻辑&#xff1a; 解释&#xff1a; L&#xff1a;…

三态门(三态缓冲器)的工作原理

转载于http://www.eeworld.com.cn/mcu/article_2017102035218.html 为减少信息传输线的数目&#xff0c;大多数计算机中的信息传输线均采用总线形式&#xff0c;即凡要传输的同类信息都走同一组传输线&#xff0c;且信息是分时传送的。在计算机中一般有三组总线&#xff0c;即数…

2021-05-18

TTL集成门电路——三态门(与非门) 1、三态门的三种输出状态:高电平(逻辑1&#xff09;&#xff0c;低电平(逻辑0&#xff09;&#xff0c;高阻态(电阻大&#xff0c;可以视为开路) 2、三态门真值表及逻辑符号: !3、三态门的工作电路: 4、三态门的工作原理&#xff1a; EN为三…

锁存器、触发器、寄存器和缓冲器的区别

目录 一、锁存器 二、触发器 三、寄存器 四、移位寄存器 五、总线收发器/缓冲器 六、锁存器与触发器的区别 七、D触发器和D锁存器的区别 八、寄存器与锁存器的区别 一、锁存器 锁存器&#xff08;latch&#xff09;---对脉冲电平敏感&#xff0c;在时钟脉冲的电平作用…

三态门与高阻态

转自&#xff1a;https://blog.csdn.net/lin200753/article/list/4 高阻态这是一个数字电路里常见的术语&#xff0c;指的是电路的一种输出状态&#xff0c;既不是高电平也不是低电平&#xff0c;如果高阻态再输入下一级电路的话&#xff0c;对下级电路无任何影响&#xff0c;…

三态门与高阻状态

三态门&#xff0c;是指逻辑门的输出除有高、低电平两种状态外&#xff0c;还有第三种状态——高阻状态的门电路。高阻态相当于隔断状态&#xff08;电阻很大&#xff0c;相当于开路&#xff09;。 三态门都有一个EN控制使能端&#xff0c;来控制门电路的通断。 可以具备这三种…

【微机原理与接口技术】简单易学的 简单接口芯片—— 三态门 74LS244和 锁存器 74LS273

作者&#xff1a;MiTu_-_ 本帖内容著作权归作者所有&#xff0c;转载请务必保留本文链接 接口电路的基本构成 CPU通过接口与外部设备的连接示意图如下&#xff1a; 负责把信息从外部设备传入 CPU 的接口&#xff08;端口&#xff09;叫做输入接口&#xff08;端口&#xff09…

三态门——概念,作用,原理

介绍一下三态门的概念、作用、原理 目录 三态门的概念 三态门的作用 实现总线结构 实现双向数据传输 三态门的原理 三态门的概念 三态门是指逻辑门的输出有三种状态&#xff1a;高电平状态、低电平状态、高阻状态。 其中&#xff0c;高阻状态相当于隔离状态&#xff08;…

数字IC设计中的三态门原理

数字电路中的三态门 可参考另外一篇博客数字电路基础知识——CMOS门电路 (与非门、或非、非门、OD门、传输门、三态门) 三态门除了高低电平&#xff0c;还有第三个状态——高阻态。 三态门&#xff08;Three-state gate&#xff09;是一种重要的总线接口电路。也常常出现在芯片…

计算机电源缓冲器,集成电路中缓冲器的作用

描述 缓冲器的概念 缓冲器在不同的领域有不同的含义。 在计算机领域&#xff0c;缓冲器指的是缓冲寄存器&#xff0c;它分输入缓冲器和输出缓冲器两种。前者的作用是将外设送来的数据暂时存放&#xff0c;以便处理器将它取走&#xff1b;后者的作用是用来暂时存放处理器送往外设…

三态门介绍

如下图&#xff0c;为两种形式的三态门&#xff0c;&#xff08;a&#xff09;和&#xff08;b&#xff09;一致&#xff1b;&#xff08;c&#xff09;和&#xff08;d&#xff09;一致。 对于图&#xff08;a&#xff09;其真值表如下&#xff1a; 对于图&#xff08;b&#…

单片机I/O口管脚内部结构(锁存器,输出驱动器,三态缓冲器,多路开关)

学习ARM嵌入式的时候&#xff0c;发现自己对以前学过的数模器件的知识遗忘了不少&#xff0c;按照我的进度本来应该继续学习ARM微处理器控制的课程&#xff0c;但想着后来势必还会遇到相同的问题所以就准备中断一下&#xff0c;杀回来把汇编和一些电路知识再总结一下&#xff0…

三态(tri-state)门、双向(bi-directional)端口的建模、仿真和综合

目录 1. 概要 2. 三态门 2.1 概念 2.2 三态门建模 3. 双向端口 3.1 HDL语言描述 3.2 直接调用元件库中的模块 3. 仿真 4. 综合 1. 概要 双向端口顾名思义是一种既可以作为输入端口接收数据,也可以作为输出端口发出数据,它对数据的操作是双向的。比如某个设计需要一个…

FPGA基础知识极简教程(8)详解三态缓冲器

博文目录 写在前面正文 全双工与半双工FPGA和ASIC中的三态缓冲器如何在VHDL和Verilog中推断出三态缓冲区 参考资料交个朋友 写在前面 下面用举例子的方式引出三态门&#xff0c;内容过长&#xff0c;大家可直接跳过&#xff0c;进入正文&#xff01; 三态门在FPGA以及ASIC设计中…

三态缓冲器的工作原理

转载自---百家号 三态缓冲器&#xff08;Three-state buffer&#xff09;&#xff0c;又称为三态门、三态驱动器&#xff0c;其三态输出受到使能输出端的控制&#xff0c;当使能输出有效时&#xff0c;器件实现正常逻辑状态输出&#xff08;逻辑0、逻辑1&#xff09;&#xff…

VSCODE调试时在cygwin.S中发生段错误

起因&#xff1a; C实现矩阵类和向量类 当看了我实现的矩阵类后&#xff0c;一个同学问我&#xff1a; 然后我就试了试1000维&#xff0c;结果运行时在cygwin.S里引发了奇奇怪怪的Segmentation fault&#xff0c;而且这个文件还是一片空白&#xff0c;压根就没有代码 后来一番…

【高并发】高并发环境下如何优化Tomcat性能?看完我懂了!

写在前面 Tomcat作为最常用的Java Web服务器&#xff0c;随着并发量越来越高&#xff0c;Tomcat的性能会急剧下降&#xff0c;那有没有什么方法来优化Tomcat在高并发环境下的性能呢&#xff1f; Tomcat运行模式 Tomcat的运行模式有3种。 1.bio模式 默认的模式,性能非常低下,…

Java-JVM-常用参数和调优方案(超保姆级)

Java-JVM-常用参数和调优方案 必须了解的内容 必须看过Java-JVM基础(调优必须知道)知道JVM大概的情况,这篇文章我博客里有 堆区&#xff08;Java堆&#xff1a;所有的线程共享该区域&#xff09; 通过new的方式创建的对象(一个类的实例)、数组所占的空间。 非堆区&#xff1a…