zoukankan      html  css  js  c++  java
  • explicit 构造函数的意义

    在类的构造函数中, 凡是只带有一个参数的构造函数, 都定义了一组隐式转换, 把构造函数的参数类型转换成该类的类型;

    如:

    Smallint(int)把int型的值转化成Smallint值;

    extern void cacl(Smallint);

    int i;

    //需要把i转换成Smallint值, Smallint(int)能做到这一点

    calc(i);

    可以理解成:

    //创建一个临时对象

    {

    Smallint temp = Smallint(i);

    calc(temp);

    }

    如果需要,编译器会在调用构造函数的转换之前,在参数上应用标准转换序列;如:

    extern void calc(Smallint);

    double dobj;

    calc(dobj);//通过标准转换,dobj被从double转换到int

    编译器隐式的用单参数构造函数,将参数类型的值转换成构造函数类类型的值,可能不是我们所希望的。

    为了防止用单参数的构造函数进行隐式的类型转换,我们把单参数的构造函数(包括后面的参数有缺省值的)声明为explicit

    此时, 如果需要执行类型转换,只要程序以强制的形式显式的要求转换即可。如:

    class Number

    {

    public:

    explicit Number(const Smallint &);

    };

    extern void fun(Number);

    Smallint si(87);

    int main()

    {

    fun(si);//error 从Smallint到Number没有隐式转换

    fun(Number(si));//ok cast

    fun(static_cast<Number>(si));//ok 强制转换

    }


  • 相关阅读:
    MYSQL 优化(二),持续更新收藏
    一些linux命令 备份下
    lsyncd +xinetd+syncd 多服务器文件同步
    阿里slb+ecs+https
    微擎 从 php5 到php7 的各种填坑 持续更新
    lmap
    微擎的ifp ife ifpp
    工具索引 mark名字
    Funny Bug || Sky Hole
    mysql 查询小技巧
  • 原文地址:https://www.cnblogs.com/lidan/p/2239494.html
Copyright © 2011-2022 走看看