zoukankan      html  css  js  c++  java
  • c/c++ explicit用法

    试想一个类,它的构造函数只有一个参数,

    1 class test
    2 {
    3     test( int a ) {} 
    4 }

    这时我想用一个int b = 10初始化它,这当然没问题,但如果你用一个字符例如'c'初始化test类,会发现代码成功编译

    1 test a = 12; //OK!
    2 
    3 test b = 'c'; //also OK!

    这时因为字符’c'自动转型为了一个int,这在c++中是可行的,一般来说,这种转型是很方便的,因为你不需要刻意为了一个变量的类型而去用相应的关键字,但在某些情况下,程序员们不希望自己的类被一些“奇奇怪怪”的变量给初始化了,这很可能导致错误( 例如,12.4567转化为int就变为12了)

    所以我们就需要使用explicit了。

    C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)

    当构造函数被explicit修饰时,刚才的用’c'初始化的类编译器就会报错了,因为explicit表示了你只希望用int而不是其他的什么类型(哪怕它可以转化为int)来初始化这个类。

    explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了

    这种情况下,加不加explicit效果是一样的,当然这也有例外,构造函数除了第一个参数外剩下参数都有默认值时,explicit仍然有用

     1 int main()
     2 {
     3     class test 
     4     {
     5         test( int a, int b, int c ) { }
     6         //加不加explicit都一样,多参数情况自动不允许隐式转化
     7     };
     8     
     9     class test_2 
    10     {
    11         explicit test_2( int a, int b = 0, int c = 0 ) { }
    12         //当构造函数只传入一个参数时,explicit仍能保证其不能隐式转化
    13     };
    14 }
    什么时候能够不再这么懒惰
  • 相关阅读:
    ComboBox.DoubleClick事件
    mktime 夏令时
    STL String的使用[转]
    加在电源后至进入操作系统前的计算机的行为
    C语言数据类型大小分析(基于VC2005编译器)
    linux线程同步之条件变量
    windows 下架设svn服务器(转载+修改) (非利用Google项目托管)
    浅尝《Windows核心编程》之内核对象
    C——数组与指针
    如何用U盘做系统启动盘WINPE 并且 利用WINPE安装Ghost
  • 原文地址:https://www.cnblogs.com/chaoswr/p/7783877.html
Copyright © 2011-2022 走看看