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

explicit构造函数

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

相关文章:

  • 视频转GIF图
  • shell脚本专家指南--库文件
  • 大数据系列之数据仓库Hive安装
  • Linux系统下,启动Tomcat有时报Address already in use
  • 间谍网络(tarjan缩点)
  • 测试工程师的明天在哪里
  • 【php技术】PHP错误类型和屏蔽方法
  • JAVA进程占用CPU分析
  • Android - Activity生命周期
  • maven scope使用和理解
  • JavaScript数组
  • freemarker自定义标签
  • [转]使用JQuery读取XML文件数据
  • android安装
  • jQuery 读xml并search
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【剑指offer】让抽象问题具体化
  • CAP理论的例子讲解
  • Docker下部署自己的LNMP工作环境
  • ES学习笔记(12)--Symbol
  • HTTP那些事
  • JavaScript设计模式之工厂模式
  • JAVA并发编程--1.基础概念
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Unix命令
  • ViewService——一种保证客户端与服务端同步的方法
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 从伪并行的 Python 多线程说起
  • 排序算法学习笔记
  • 区块链将重新定义世界
  • 如何合理的规划jvm性能调优
  • 如何利用MongoDB打造TOP榜小程序
  • 一、python与pycharm的安装
  • 在Mac OS X上安装 Ruby运行环境
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​TypeScript都不会用,也敢说会前端?
  • #ifdef 的技巧用法
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (AngularJS)Angular 控制器之间通信初探
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • ***检测工具之RKHunter AIDE
  • .NET Remoting学习笔记(三)信道
  • .net 生成二级域名
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • @Mapper作用
  • []sim300 GPRS数据收发程序
  • []常用AT命令解释()
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [Django 0-1] Core.Email 模块
  • [Excel] vlookup函数
  • [Java] 模拟Jdk 以及 CGLib 代理原理
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句
  • [MZ test.16]P2 math 乘方e