zoukankan      html  css  js  c++  java
  • 【转】C++ explicit 使用详解

    在C++中,根据默认的规定,在定义只有一个参数的构造函数时同时也定义了一个隐式转换:将构造函数的参数对应的数据类型的数据转化为该类的对象,如下面代码所示:

    class CMyString
    {
        CMyString(const char * var) ;//C风格字符串var作为初始化值
        .......
    };
     
    CMyString myString = "EXPLICIT example."; //隐式转换,相当于CMyString myString = CMyString("EXPLICIT example.");

    但是这种隐式转换会造成歧义,例如:

    class CMyString
    {
        CMyString(int byteLen);//分配字符串byteLen个字节
        CMyString(const char *var);//用C风格字符串var作为初始化值
        ......
    };

    下面的两种初始化是正常的:

    CMyString firstStr(10); //分配10个字节的空字符串
    CMyString secStr = CMyString(10); //分配10个字节的空字符串

    但是接下来的两种初始化就会引起歧义:

    CMyString thirdStr = 10; //也是分配10个字节的空字符串
    CMyString fourthStr = 'a'; //注意!这里分配 int('a') 个字节的空字符串

    thirdStr和fourthStr分别把 int型和 char型,隐式转换成了分配相应字节的空字符串,这容易引起歧义。

    同样,下面的情况也会引起隐式转换,造成歧义:

    void createStr(CMyString str);
    
    //调用函数createStr
    createStr(10);

    当调用createStr时,会将参数10隐式转换为CMyString类型,这也会引起歧义。

    为了避免这种歧义的发生,可以使用关键字explicit声明显示的转换:

    class CMyString
    {
        explicit CMyString(int byteLen);//分配字符串byteLen个字节
        CMyString(const char *var);//用C风格字符串var作为初始化值
        ......
    };

    下面的两种写法依然正确:

    CMyString firstStr(10); //分配10个字节的空字符串
    CMyString secStr = CMyString(10); //分配10个字节的空字符串

    但是,下面的两种写法就不正确了:

    CMyString thirdStr = 10; //编译不通过
    CMyString fourthStr = 'a'; //编译不通过

    同样,调用函数createStr时的隐式转换也不被支持了:

    //调用函数createStr
    createStr(10); //编译不通过

    总结:关键字explicit只对构造函数起作用,用来抑制隐式转换。

    转自:http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html

  • 相关阅读:
    luogu1197 [JSOI2008]星球大战
    luogu2085 最小函数值
    Vijos 1144 小胖守皇宫 【树形DP】
    洛谷 P1941 飞扬的小鸟 【DP+众多特判】
    codevs 1516 平均分数 【数学推理+求逆序对】
    tyvj 1936 太空战队 【强连通分量】
    USACO 2.4 Overfencing 【种子染色法+递推】
    code[vs] 2488 绿豆蛙的归宿【反向拓扑+DP】
    USACO 2.3 Zero Sum 【搜索+字符串处理+模拟计算】
    USACO 2.3 Cow Pedigrees 【DP+前缀和优化】
  • 原文地址:https://www.cnblogs.com/mingfish/p/3178726.html
Copyright © 2011-2022 走看看