explicit构造函数

C++中的explicit详解 C++ explicit关键字详解 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子: class CxString // 没有使用... 阅读详情
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
class String {
String ( const char* p ); // 用C风格的字符串p作为初始化值
//…
}
String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”);
 
但是有的时候可能会不需要这种隐式转换,如下:
class String {
       String ( int n ); //本意是预先分配n个字节给字符串
String ( const char* p ); // 用C风格的字符串p作为初始化值
//…
}
 
下面两种写法比较正常:
String s2 ( 10 );   //OK 分配10个字节的空字符串
String s3 = String ( 10 ); //OK 分配10个字节的空字符串
 
下面两种写法就比较疑惑了:
String s4 = 10; //编译通过,也是分配10个字节的空字符串
String s5 = ‘a’; //编译通过,分配int(‘a’)个字节的空字符串
 
s4 和s5 分别把一个int型和char型,隐式转换成了分配若干字节的空字符串,容易令人误解。
为了避免这种错误的发生,我们可以声明显示的转换,使用explicit 关键字:
class String {
       explicit String ( int n ); //本意是预先分配n个字节给字符串
String ( const char* p ); // 用C风格的字符串p作为初始化值
//…
}
加上explicit,就抑制了String ( int n )的隐式转换,
 
下面两种写法仍然正确:
String s2 ( 10 );   //OK 分配10个字节的空字符串
String s3 = String ( 10 ); //OK 分配10个字节的空字符串
 
下面两种写法就不允许了:
String s4 = 10; //编译不通过,不允许隐式的转换
String s5 = ‘a’; //编译不通过,不允许隐式的转换
 
因此,某些时候,explicit 可以有效得防止构造函数的隐式转换带来的错误或者误解

----------------------------------------------------------
explicit   只对构造函数起作用,用来抑制隐式转换。如:   
  class   A   {   
          A(int   a);   
  };   
  int   Function(A   a);   
    
  当调用   Function(2)   的时候,2   会隐式转换为   A   类型。这种情况常常不是程序员想要的结果,所以,要避免之,就可以这样写:   
    
  class   A   {   
          explicit   A(int   a);   
  };   
  int   Function(A   a);   
    
  这样,当调用   Function(2)   的时候,编译器会给出错误信息(除非   Function   有个以   int   为参数的重载形式),这就避免了在程序员毫不知情的情况下出现错误。

总结:explicit   只对构造函数起作用,用来抑制隐式转换。

参考:
http://blog.youkuaiyun.com/smilelance/archive/2007/03/14/1528737.aspx
http://topic.youkuaiyun.com/t/20040509/15/3046021.html
explicit构造函数的作用 explicit构造函数是用来防止隐式转换的。看下面一段代码: class Test1 { public: Test1(int n){num = n ;}; //普通构造函数 private: int num ; }; class Test2 { public: explicit Test2(int n ){num = n ;} //explicit(显示)构造函数 private: int num ; }; int main() { Test1 t1 = 12 ; // 阅读详情

相关推荐

EtherCAT简介

EtherCAT(EtherNet Control Automation Technology)是由德国公司BECKHOFF公司于2003年提出的实时工业以太网技术。其具有高速、高数据有效率的特点,支持多种设备的连接拓扑结构。从站节点使用专用的控制芯片,例如:microchip公司的Lan9252、BECKHOFF公司的ET1100等ESC(EtherCAT slave controller)芯片。主站的搭建方式有很多,例如:开源主站IGH、SOEM、商业化主站TwinCAT等。

m0_73482095的博客 1万+

explicit

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p作为初始化值 //… } String s1

lhc717的专栏 756

ICNN实现入侵检测的思路与源码(CIC-IDS-2017)

基于ICNN实现入侵检测,可用于现实网络

t1274171989的博客 8415

C++构造函数前面加explicit关键字的作用

/* explicit的作用: 在C++中,explicit关键字是用来修饰类的构造函数的,被修饰的构造函数的类,不能发生相应的隐式类型的转换, 只能以显示的方式进行类型转换。 explicit使用的注意事项: 1.explicit关键字只能用于类内部的构造函数声明上。 2.explicit关键字作用于单个参数的构造函数,被修饰的构造函数的类,不能发生相应的...

weixin_41946900的博客 1976

Qt绘图库对决:QWT与QCustomPlot的实战选型指南

本文为Qt开发者提供了QWT与QCustomPlot两大绘图库的实战选型指南。文章从功能特性、性能资源、开发效率三大维度进行深度对比,并结合工业监控、科学计算、嵌入式设备等典型场景,给出了清晰的决策清单。对于需要专业科学图表(如极坐标、等高线图)的场景推荐QWT;对于追求高性能、实时性、快速开发及嵌入式部署的通用图表需求,QCustomPlot是更优选择。

alpha的博客 241

华为od 面试八股文_测试/测试开发_05_含答案

华为od 面试八股文_测试/测试开发_05_含答案

MISAYAONE的博客 2558

C++ 中explicit关键字详解

目录explicit关键字的作用使用情况类型转换函数单操作数构造函数同时出现拷贝构造函数和类型转换函数拷贝构造函数总结参考文献 explicit关键字的作用 explicit关键字在写程序时使用的次数较少,但是仔细观察会发现,在C++标准库中的相关类声明中explicit出现的频率是很高的,那么explicit关键字到底有什么作用呢?接下来我就为大家一一解答. explicit为清晰的;明确的之意...

l2563898960的博客 2万+

嵌入式系统开发笔记112:通过有人云测试MQTT

项目中使用到“有人”公司的WH-LTE-7S0模块,本文讲解通过有人云进行MQTT测试的方法。

snmplink的博客 998

C++笔记(1)explicit构造函数

C++笔记(1)explicit构造函数 Explicit Constructors(显式构造函数)收藏   按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); // 用C风格的字符串p作为初始化值 //… } String s

zerokkqq的专栏 278

逆向分析-SeparationPreview.aip-分色预览-结构分析(一)-x64dbg条件日志打印-命令表达式-PS脚本

从功能上分析,仅显示使用的专色这个功能,并没有触发插件接口。使用X64dbg加载illustrator进程,切换到句柄窗口,在窗口过程中,右键刷新获取界面。在x64dbg中,在UI中可以输入一些条件表达式,能够计算出对应的值,并打印在日志中。常用的,如果非暂停,输出第一个参数。参数二是utf16的指针,utf16@字符串地址,这里的字符串地址为[[ebp-108]]参数一是utf8的,utf8@字符串地址,这里的字符串地址为[ebp-28]从界面上分析,一个颜色列表,及仅显示专色的多选框组成。

插件开发 644

【Windows Server 2019】DNS服务器的配置与管理——DNS正向解析

博文介绍了如何使用正向解析区,包括创建和添加并验证,以及术语 主机记录,别名,邮件交换记录的解释。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 1万+

cpp——类——explicit构造函数

概述 explicit只能修饰构造函数,构造函数默认implicit,implicit不是keyword implicit构造函数:可用于直接初始化,也可用于复制初始化 explicit构造函数:可用于直接初始化,不可用于复制初始化 implicit class CAnimal { public: CAnimal(int group) : mGroup(group) { cout << "CAnimal(" << group << ")" << endl; }

mardax的专栏 645

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++中explicit构造函数的理解

1.explicit类型的构造函数和普通类型的构造函数的区别 普通的构造函数可以被显式调用和隐试调用,但是explicit的构造函数只能被显式的调用,不能被隐试的调用。代码示例如下: class test0{ private: int i; public: explicit test0(int n) { i = n; cout << "i = " <&...

仗劍走天涯 992

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

使用explicit构造函数

使用explicit构造函数

qqrrjj2011的博客 1387

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C/C++ explicit关键字】为什么有了explicit关键字的构造函数 就不能再有 其无参构造函数

关键字的构造函数,你就不能有相同签名的无参构造函数(默认构造函数),除非后者也标记为。,如果它不是必需的。这是因为无参构造函数可能会被用于隐式类型转换,而。试图调用无参的默认构造函数,而这个默认构造函数与。的构造函数,这样它就不会与带参数的构造函数重载。构造函数重载的无参构造函数,除非你也将其标记为。的构造函数,编译器不允许隐式调用无参构造函数。这样可以避免编译器错误,并确保类型的安全使用。在这个例子中,无参构造函数显式地调用了带。在 C++ 中,如果你有一个带有。关键字时,你需要确保不会创建与。

一起学习进步! 657

应用篇:explicit声明的构造函数作用

应用篇:explicit声明的构造函数作用应用篇:explicit声明的构造函数作用总结转载需注明出处 应用篇:explicit声明的构造函数作用 总结   // explicit构造函数是用来防止隐式转换的。请看下面的代码:   1 class Test1   2 {   3 public:   4 Test1(int n) { num = n; } //普通构造函数   5 private:   6 int num;   7 };   8   9 class Test2   10 {   11 pub

qq_49710945的博客 435

C++: 构造函数中的explicit详解

explicit在 C++ 中,explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化。默认情况下,单参数构造函数既可以显式调用,也可以被编译器用来进行隐式类型转换。explicit这个构造函数只能显式调用,不能用于隐式转换。explicit防止构造函数或转换运算符被隐式调用。在单参数构造函数和转换运算符中使用最为常见。自 C++11 起,还能用于;C++20 引入,进一步增强灵活性。默认加上explicit,除非你有充分理由允许隐式转换。

Ethan_Rich的博客 739

explicit 构造函数

一、构造函数、默认构造函数、合成的默认构造函数 构造函数,是函数名与类名相同、没有返回类型的特殊的成员函数。可以有初始化列表。 默认构造函数,没有形参,或所有形参都有默认实参的构造函数。 如果没有显示定义任何构造函数,编译器会自动创建合成的默认构造函数。一个类哪怕只定义了一个构造函数(不管是不是默认构造函数),编译器也不会再生成默认构造函数。 合成的默认构造函数使用与变量初始化相同

buxizhizhou530的专栏 1873
上一篇: tensorflow word2vec编译
下一篇: linux多线程编程之线程安全mutex锁的使用
青松愉快
博客等级 码龄14年 71粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值