【C++快速上手】二十、explicit(显式)关键字学习笔记(待完善)

举报
ReCclay 发表于 2022/02/22 00:53:34 2022/02/22
【摘要】 一、explicit(显式)关键字介绍 在C++中,我们有时可以将构造函数用作自动类型转换函数。但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++新增了关键字explicit,用于...

一、explicit(显式)关键字介绍

C++中,我们有时可以将构造函数用作自动类型转换函数。但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++新增了关键字explicit,用于关闭这种自动特性。即被explicit关键字修饰的类构造函数,不能进行自动地隐式类型转换,只能显式地进行类型转换

注意只有一个参数的构造函数,或者构造函数有n个参数,但有n-1个参数提供了默认值,这样的情况才能进行自动地隐式类型转换

在C++中, 一个参数(或虽然有多个参数,但只有1个参数没有默认值)的构造函数, 承担了两个作用:

  • 1、发挥普通构造函数功能
  • 2、默认且隐含的类型转换操作符

二、配合代码辅助理解

显式声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:

#include <iostream>
using namespace std;

class Test1
{
public :
    Test1(int num) // 显式声明的构造函数
    {
        n = num;
    }
private:
    int n;
};

class Test2
{
public :
    explicit Test2(int num) // 隐式声明的构造函数
    {
        n = num;
    }
private:
    int n;
};

int main()
{
    Test1 t1(12); 	// OK:直接初始化
    Test1 t2 = 12;  // OK:复制初始化
    Test2 t3(13);	// OK:直接初始化
    Test2 t4 = 13;  // 错误:被 explicit 修饰构造函数的对象不可以复制初始化

    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

上面的代码中,"Test1 t2 = 12;" 这句为什么是可以的呢?

在C++中,如果的构造函数只有一个参数(或虽然有多个参数,但只有1个参数没有默认值)时,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。也就是说 “Test1 t2 = 12;” 这段代码, 编译器自动将整型转换为Test1类对象, 实际上等同于下面的操作:

Test1 t2(12);
或  
Test1 temp(12);  
Test1 t2 = temp;

  
 
  • 1
  • 2
  • 3
  • 4

运行该程序,会发现在Test2 t4 = 13;报错,具体报错信息如下:

 error: conversion from 'int' to non-scalar type 'Test2' requested

  
 
  • 1

当注释掉Test2 t4 = 13;,便又可编译成功!这也充分说明加入explicit关键字后是禁止隐式转换的!


参考

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/114526945

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。