zoukankan      html  css  js  c++  java
  • C++的关键字 explicit的作用———菜鸟级日记

     C++的关键字 explicit的作用———菜鸟级日记

     author:stonehat

    从C++大学教程中学到了一个比较好玩的东西。

    请看下面代码:

    #include <stdio.h>
    class T
    {
    public:
    int a;
    T()
    {
    }

    T(int a)
    {
    this->a = a;
    }

    void print()
    {
    printf("%d\n",a);
    }
    };
    void r(T a)
    {
    a.print();
    }

    int main()
    {
    r(3);
    getchar();
    }

    是否能够编译通过?试一下就知道。

    还成功执行了。

    上面代码执行结果打印出:3

    再看下面的代码: 


    #include <stdio.h>
    class T
    {
    public:
    int a;
    T()
    {
    }

    explicit T(int a)
    {
    this->a = a;
    }

    void print()
    {
    printf("%d\n",a);
    }
    };
    void r(T a)
    {
    a.print();
    }

    int main()
    {
    r(3);
    getchar();
    }

    编译不通过。

    总结原因:关键字explicit可以禁止“单参数构造函数”被用于自动类型转换,

    例如

    T a = 2;

    我猜想编译器会 这样初始化T a(2); 

    还有例如

    T b();

    T a = b;

    会变成初始化 T a(b);

    所以 C++有默认复制构造函数(要注意如果成员里面有指针类型,要自己写一个复制构造函数,否则代码会变的很惨)。

    下面还有一段代码:

    /*
    ID:rongkan1
    LANG: C++
    PROG:namenum
    */
    #include <stdio.h>
    class T
    {
    public:
    int a;
    T()
    {
    }

    explicit T(int a)
    {
    this->a = a;
    }

    void print()
    {
    printf("%d\n",a);
    }
    };
    void r(T a)
    {
    a.print();
    }

    int main()
    {
    T a = (T)3; // 因为这里是强制转换(explicit 禁止的是自动转换),所以能够编译通过,并且运行无问题。
    getchar();
    }



  • 相关阅读:
    linux-满足多字符条件统计行数
    oracle的面试问题
    在开发过程中为什么需要写存储过程
    面向对象编程
    动态SQL
    触发器

    子程序
    游标
    集合
  • 原文地址:https://www.cnblogs.com/stonehat/p/2200168.html
Copyright © 2011-2022 走看看