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 强制转换

    }


  • 相关阅读:
    探讨GTK+应用程序的优化方法
    X Window研究笔记(9)
    X Window研究笔记(10)
    X Window研究笔记(7)
    用gdbserver调试共享库(改进版)
    X Window研究笔记(11)
    Gtkminimo中的几个BUG
    编译基于DirectFB的Phoneme(Advance)
    X Window研究笔记(8)
    X Window研究笔记(12)
  • 原文地址:https://www.cnblogs.com/lidan/p/2239494.html
Copyright © 2011-2022 走看看