广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++explicit关键字讲解
  • 250
分享到

C++explicit关键字讲解

2024-04-02 19:04:59 250人浏览 八月长安
摘要

目录1 隐式转换2 显示转换前言: c++编码时,可以通过构造函数将相应的数据类型转换成为C++类的对象,从某种程度来说给编码带来了方便,但并不是每次都正确,为了避免这种情况,C++

前言:

c++编码时,可以通过构造函数将相应的数据类型转换成为C++类的对象,从某种程度来说给编码带来了方便,但并不是每次都正确,为了避免这种情况,C++提供了explicit关键字,相对于implicit而言,他默认关闭了隐式类型转换方法。至于两者有什么区别,通过下面的代码进行比较说明。

1 隐式转换

C++ 构造函数默认类型为implicit,定义时既可以显示说明也可以默认不加该标识符。


// 没有使用explicit关键字的类声明, 即默认为隐式声明  
class CString{  
private:
    char *m_pStr;  
    int m_iSize; 
public: 
    CxString(int size){  
        m_iSize = size;
        m_pStr = malloc(m_iSize + 1);
        memset(m_pStr, 0, m_iSize + 1);  
    }  
    CxString(const char *p)  {  
        int size = strlen(p);  
        m_pStr = malloc(size + 1);
        strcpy(m_pStr, p);
        m_iSize = strlen(m_pStr);  
    }
    ~ CxString(){
        if(m_pStr)
        {
            delete m_pStr;
            m_pStr = nullptr;
        }
    }
};


如上的代码中在实例化类的对象时以下方法都是正确的。

如下所示:


CString str1("12121");//CxString(const char *p)  
CString str2="abc";//CxString(const char *p)
CString str4(4);//CxString(int size) 
CString str5=6;//CxString(int size)


上面的使用方式都会默认调用相应的构造函数实现对象的初始化,以CString str5=6为例,在对对象进行实例化的过程中主要进行了如下操作:


CString string5(6); 
//或者如下所示 
CString temp(6);  
CString string5 = temp; 


2 显示转换

在构造函数上使用了explicit关键字后,通过构造函数进行对象实例化时需要进行显示类型转化。否则将会报错。

依旧以上面的代码为例:


class CString{  
private:
    char *m_pStr;  
    int m_iSize; 
public: 
    explicit CString(int size) {  
        m_iSize = size;
        m_pStr = (char *)malloc(m_iSize + 1);
        memset(m_pStr, 0, m_iSize + 1);  
    }  
    explicit CString(const char *p){  
        int size = strlen(p);  
        m_pStr = (char *)malloc(size + 1);
        strcpy(m_pStr, p);
        m_iSize = strlen(m_pStr);  
    }
};


如上:再次使用相同得到方式对类进行实例化时将会报错,报错内容如下:

通过运行结果可以说明:explicit关键字可以防止构造函数进行隐式自动转换

3 再次拆解

explicit关键字只对构造函数有一个参数的形式有效,如果构造函数有多个参数时explicit的功能也将失效,但是C++也提供了一种例外,既如果构造函数的其他参数都有默认值及时参数个数大于1个explicit也是生效的。

如下面的代码所示:


class CPoint
{  
private:
    float m_fX;  
    float m_fY; 
public: 
    explicit CPoint(float x,float y=9.8):m_fX(x),m_fY(y) 
    {  
        
    }  
};  
int main()
{
    CPoint point1(2,3);
    CPoint point2=4.5;
    return 0;
}


如代码所示,编译时将会报错,报错内容为:

如果要解决上面的问题可以用下面得到方法:

按照显示类型转换的方式进行处理,如:


 CPoint point1(2,3);
CPoint point2(4.5);


将explicit关键字去掉,允许构造函数进行隐式转换数据类型,如:


CPoint(float x,float y=9.8):m_fX(x),m_fY(y) 
{          
}  

到此这篇关于C++ explicit关键字讲解的文章就介绍到这了,更多相关C++ explicit关键字内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++explicit关键字讲解

本文链接: https://www.lsjlt.com/news/160766.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++explicit关键字讲解
    目录1 隐式转换2 显示转换前言: C++编码时,可以通过构造函数将相应的数据类型转换成为C++类的对象,从某种程度来说给编码带来了方便,但并不是每次都正确,为了避免这种情况,C++...
    99+
    2022-11-12
  • C++之explicit关键字
    目录一、单参构造函数二、多参构造函数👉构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用 一、单参构造函数 还是老朋...
    99+
    2023-05-15
    C++ explicit关键字 explicit关键字 C++ explicit
  • C++中的explicit关键字详解
    目录前言1. 抑制构造函数定义的隐式转换2. 为转换显式地使用构造函数3. 类型转换运算符可能产生意外结果4. 显示的类型转换运算符5. explicit练习5.1 当不使用expl...
    99+
    2022-11-13
  • C++ Explicit关键字详细解析
    explicit关键字用来修饰类的构造函数,表明构造函数是显示的,相对的是implicit关键字。首先这个关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上,它的作用...
    99+
    2022-11-15
    Explicit 关键字
  • C++ explicit关键字的使用详解
    在C++中,我们有时可以将构造函数用作自动类型转换函数。但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++新增了关键字explicit,用于关闭这种自动特性。即...
    99+
    2022-11-12
  • C++中explicit关键字怎么用
    这篇文章给大家分享的是有关C++中explicit关键字怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 隐式转换C++ 构造函数默认类型为implicit,定义时既可以显示说明也可以默认不加该标识符。//...
    99+
    2023-06-22
  • 老生常谈C++explicit关键字
    目录显式和隐式的区别总结explicit 关键字用于显式声明一个类构造函数是显式而非隐式的,从而禁用类构造函数的隐式自动类型转换。类构造函数默认情况下即声明为implici...
    99+
    2023-03-24
    C++ explicit关键字 C++ explicit
  • C++ explicit关键字怎么使用
    这篇“C++ explicit关键字怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++ exp...
    99+
    2023-07-05
  • C++中如何使用 explicit关键字
    这期内容当中小编将会给大家带来有关C++中如何使用 explicit关键字,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有&...
    99+
    2023-06-17
  • C++中explicit关键字的作用是什么
    本篇文章为大家展示了C++中explicit关键字的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对...
    99+
    2023-06-17
  • c++中explicit与mutable关键字的深入探究
    今天说一说c++里面的两个关键字explicit和mutable。 1. explicit关键字 在写c++标准输入输出相关文章,查看iostream实现代码的时候,经常看到构造函...
    99+
    2022-11-12
  • C/C++举例讲解关键字的用法
    目录staticstatic修饰全局变量static修饰局部变量static修饰函数constBOOLbreakcontinuestatic static修饰全局变量 static修...
    99+
    2022-11-13
  • C++示例讲解friendstaticconst关键字的用法
    目录一、友元函数1.1重载operator<<1.2友元函数1.3友元类二、关键字const2.1const修饰类的成员函数三、关键字static3.1static类成员...
    99+
    2022-11-13
  • C++中怎么利用explicit关键字实现构造函数
    这篇文章给大家介绍C++中怎么利用explicit关键字实现构造函数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数...
    99+
    2023-06-17
  • C语言中volatile关键字的深入讲解
    1. 什么是volatile关键字? volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储...
    99+
    2022-11-12
  • C++深入讲解namespace与string关键字的使用
    目录namespace1.为什么使用namespace2.namespace的定义3.namespace的使用4.使用using指示符string1.string的定义及初始化2.访...
    99+
    2022-11-13
  • C++深入讲解new与deleted关键字的使用
    目录可执行程序的虚拟地址空间1.new的运算符用法(关键字)2.new的函数用法3.定位new4.new创建对象5.delete6.对于内置类型new/delete/malloc/f...
    99+
    2022-11-13
  • 讲解Python 中的 with 关键字
    我们中的许多人在 Python 代码中一遍又一遍地看到这个代码片段: with open('Hi.text', 'w') as f: f.write("Hello, ther...
    99+
    2022-11-11
  • Java中的Native关键字讲解
    目录一、Java中Native关键字的语法二、Native关键字是如何工作的?三、代码示例四、Java中Native关键字的优势五、规则六、总结前言: native关键字充当JAVA...
    99+
    2022-11-12
  • Java中instanceof关键字实例讲解
    目录1.向上转型 向下转型2.强制类型转换的应用3.instanceof 关键字使用4.测试举例5.强制类型转换成功总结1.向上转型 向下转型 2.强制类型转换的应用 应用多态性时...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作