按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
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   只对构造函数起作用,用来抑制隐式转换。

转载于:https://www.cnblogs.com/acm-icpcer/p/6611861.html

【转载】关于c++中的explicit相关推荐

  1. c++中的explicit关键字

    2007-05-11 14:42:00 | 作者: Admin ] c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有&quo ...

  2. 【c++】【转】c++中的explicit关键字

    http://www.cnblogs.com/chio/archive/2007/09/17/895263.html c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式(调用) ...

  3. 深入理解C++中的explicit关键字

    深入理解C++中的explicit关键字 kezunhai@gmail.com http://blog.csdn.net/kezunhai C++中的explicit关键字只能用于修饰只有一个参数的构 ...

  4. C++中的explicit详解

    C++ explicit关键字详解 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是impl ...

  5. C++中的explicit关键字用法

    c++中的explicit关键字用来修饰类的构造函数,被修饰的类的构造函数不能进行隐式类型的转换,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐 ...

  6. 【转】认识 C++ 中的 explicit 关键字

    C++ 中 explicit 关键字的作用 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使 ...

  7. VC++工作笔记0003---C++中的explicit关键字

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 个人理解: 这个的作用,其实就是,防止隐式转换,因为如果有隐式转换的话,那么用起来,感觉就怪怪的, ...

  8. 【转载】 C#中使用Sum方法对List集合进行求和操作

    在C#的List操作中,有时候我们需要对List集合对象的某个属性进行求和操作,此时可以使用Lambda表达式中的Sum方法来快速实现此求和操作,使用Sum方法可使代码简洁易读,并且省去写for循环或 ...

  9. C++中的explicit

    explicit 前言 0x00 explicit 前言 C++中, 一个类的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色. 1.是个构造器 2.是个默认且隐含的 ...

  10. 【转载】数据挖掘中所需的概率论与数理统计知识

    [转载]数据挖掘中所需的概率论与数理统计知识 (关键词:微积分.概率分布.期望.方差.协方差.数理统计简史.大数定律.中心极限定理.正态分布) https://blog.csdn.net/zbj366 ...

最新文章

  1. redis入门系列(一)redis安装部署
  2. 枚举与Combox的SelectedIndex绑定出现怪异问题的解决方案
  3. 火星今天飞抵西非国家寻找埃博拉疫情
  4. hdu 4506(快速幂+找规律)
  5. [云炬创业基础笔记]第二章创业者测试23
  6. 列举在Web前端开发中经常会设置的特殊样式!
  7. LINUX IRC使用
  8. c++opencv显示中文_OpenCV安装,配置和运行
  9. Incorrect string value: '/xE7/xA8/x8B/xE5/xBA/x8F...' for column 'course' at row 1
  10. python向自己qq邮箱发信息_python 向qq邮箱发邮件
  11. 让我们发展纯粹的金钱关系吧,那多美好(转)
  12. 胎压监测 (15 分)
  13. python函数解读_通过7个Python函数来解释区块链
  14. ShowDoc v2.4.8 发布,IT团队的在线 API 文档工具
  15. iTunes C# Mobile Device API代码-立哥开发
  16. 计算机神经网络sci,神经网络方向sci期刊
  17. php订阅号网页登录,微信订阅号怎么使用网页授权登录
  18. java jsp小例题_JSP 相关试题(一)
  19. 设置固定IP后无法上网
  20. python面向对象的特征_python 面向对象的三大特性

热门文章

  1. 提供《华容道与数据结构》代码供测试
  2. 第三章 “我要点爆”微信小程序云开发之点爆方式页面和爆炸之音页面制作
  3. 2018上C语言程序设计(高级)作业-第1次作业
  4. 【翻译】《理解收益率曲线》系列
  5. Selenium Python 解决 UnexpectedAlertPresentException
  6. AC自动机 HDOJ 5384 Danganronpa
  7. 颜色空间模型(HSV\LAB\RGB\CMYK)
  8. Android使用SQLite数据库(1)
  9. 建立linux两用户之间的信任关系
  10. 一起来开发Android的天气软件(一)——功能规格介绍