zoukankan      html  css  js  c++  java
  • 透过一个实例理解C++语言的explicit关键字

     我们先看一段代码:
        建立people.cpp 文件,然后输入下列内容:
    class People
    {
        public:
          int age;
         explicit People (int a)//加上了explict关键字的构造函数
        {
          age=a;
         }
    };
    void foo ( void )
    {
         People p1(10); //方式一
         People p3=10; //方式二

    }

          在 C++ 中, 如果一个类有只有一个参数的构造函数,C++ 允许一种特殊的声明类变量的方式。

        在上面的方式二: 写下如People p3=10这样的代码,且恰好10的类型(整型int)正好是people类单参数构造函数的参数类型,这时候编译器就自动调用这个构造函数,创建一个people的对象.

          即在这种情况下,可以直接将一个对应于构造函数参数类型的数据直接赋值给类变量,编译器在编译时会自动进行类型转换,将对应于构造函数参数类型的数据(前面的例子中为10)转换为类的对象。

            可见,C++中,一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数),承担了两个角色.

    1.是个构造函数,2.是个默认且隐含的类型转换操作符.

            如果在构造函数前加上 explicit 修饰词, 则会禁止这种自动转换,在这种情况下, 即使将对应于构造函数参数类型的数据直接赋值给类变量,编译器也会报错。

         也就是说: 写下如People p3=10这样的代码,如果去除构造函数的explicit关键字修饰, 数据10将传递给people的构造函数,并创建一个people对象,实现与方式一一样的效果;  加上explicit关键字修饰,这样的代码将被认为是错误的。

          编译代码可以看到报错。

      

  • 相关阅读:
    Asp.net中导出Excel文档(Gridview)
    以太坊难度炸弹是什么?极大抑制矿工继续以POW方式挖矿!
    Solidity语言基础 和 Etherum ERC20合约基础
    BCH/BSV coin split troubleshooting
    比特币学习-Transaction的locktime属性
    在BCH硬分叉后防止重放攻击-2
    在BCH硬分叉后防止重放攻击-1
    区块链硬分叉-软分叉简单了解
    BTC和BCH 区别和联系?
    BCHABC/BCHSV的矛盾所在
  • 原文地址:https://www.cnblogs.com/ymy124/p/3638191.html
Copyright © 2011-2022 走看看