按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
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://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html

c++ explicit 修饰构造函数相关推荐

  1. 关键字explicit与构造函数

    从Qt谈到C++(一):关键字explicit与构造函数 时间 2014-04-26 22:55:44 CSDN博客 原文 http://blog.csdn.net/guodongxiaren/art ...

  2. 38.C++修饰构造函数的explicit关键字

    C++ explicit关键字的作用主要是用来修饰类的构造函数,表明该构造函数是显式的,禁止单参数构造函数的隐式转换. 如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该 ...

  3. 侯捷C++复现 :explicit在构造函数中

    首先是个这样的小数的例子,没加explicit看看是什么情况: 类: // // Created by 浅笑 on 2022/11/28. // #ifndef CLION_PJ_FRACTION_H ...

  4. C++知识点12——构造函数初步

    构造函数就是定义了类的对象的初始化方式的函数,在初始化类的对象时,会被自动调用 构造函数无返回值,可以被重载(有多个构造函数,可以有多种初始化的方式,参考C++知识点4--vector与string简 ...

  5. c++ explicit(显式)关键字

    •explicit 修饰构造函数时,可以防止隐式转换和复制初始化 •explicit 修饰转换函数时,可以防止隐式转换,但 按语境转换 除外 explicit 使用 struct A {A(int) ...

  6. C++ explicit的使用

    看到一篇文章中对explicit关键字的说明简明易懂,特此收藏和学习.https://blog.csdn.net/qq_24127015/article/details/104412800 C++提供 ...

  7. 构造函数的调用场景--构造函数与拷贝构造函数、移动构造函数之辨

    在Scott Meyers的著作<Effective C++>条款5中,明确指出要"了解C++默默编写并调用哪些函数".这里通过一个简短的C++代码,阐述哪些场景调用构 ...

  8. C++面试知识点总结

    一.static关键字的作用 1.修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化 ...

  9. 大厂面试八股文——C++

    文章目录 可变参数-printf的实现原理 编译语言和解释语言 C++空指针调用成员函数 std::move 移动语义 std::move的实现 完美转换 malloc函数底层实现 被free回收的内 ...

最新文章

  1. 汇编: and,or逻辑运算指令
  2. Web安全之XSS漏洞
  3. pstack 安装linux_详解命令-pstack
  4. Nginx下301重定向不带www的域名到带www的域名
  5. sql LEFT JOIN RIGHT JOIN(左连接)(mysql)
  6. c语言 结构作用是什么,C语言选择结构知识点
  7. HTTP消息推送原理
  8. html中onfocus作用,HTML onfocus用法及代码示例
  9. 百瓦快充伤电池?1天两充用了574天后 我发现真相
  10. Python双均线策略回测(2021-10-12)
  11. CentOS 安装meld
  12. 使用OpenBTS基站测试物联网模块安全性
  13. 手持PDA无线打印 扫描一体方案-PDA系统程序
  14. 微信视频号标题怎么写吸引眼球
  15. 用Python一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深?
  16. css自动换行,css代码
  17. Unity3D游戏开发最佳实践技巧
  18. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(五) 之 加好友,加群流程,消息管理和即时消息提示的实现...
  19. 粒子群与蚁群算法的区别
  20. 王者荣耀自动化获取金币/经验周上限 教程

热门文章

  1. VTK:Texture之TexturePlane
  2. VTK:图表之VertexSize
  3. OpenCV实现幻灯片模糊slides blur的实例(附完整代码)
  4. const关键字的作用?
  5. C++归并排序(附完整源码)
  6. python类_Python中的类
  7. ie浏览器在线使用_全新的Edge浏览器,快来尝鲜
  8. 合并k个有序链表 python_[LeetCode] 23. Merge k Sorted Lists 合并k个有序链表
  9. Java导出数据到Excel
  10. 史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)