c++ explicit

这篇博客介绍了C++中explicit关键字的使用,它用于禁止单参数构造函数的隐式转换。文章通过示例展示了如何进行显示调用和隐式转换,并解释了隐式转换可能导致的问题。使用explicit可以避免不必要的类型转换,提高代码的清晰性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++ explicit

explicit主要用于指明类的单参构造函数的是显示调用的,而非隐式调用

那么在这里什么是显示调用,什么是隐式调用呢?

来看一个显式调用的例子

#include<iostream>

using namespace std;

class A{
public:
    A(double val) : m_val(val){} //一个参数(单参)的构造函数
    double m_val;
};

int main(){
    A a1(3.14); //显示调用一个参数的构造函数

    cout << "a1.m_val = " << a1.m_val << endl;
    cout << "_________________________________________" << endl; 
    system("pause");
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tongdEKN-1655694461511)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220508191058766.png)]

大多数情况下,我们通过显示调用来对对象进行赋值,不会有问题

但是由于存在隐式转换,下面来看看隐式转换和调用

#include<iostream>

using namespace std;

class A{
public:
    A(double val) : m_val(val){} //一个参数(单参)的构造函数
    double m_val;
};

int main(){
    A a1(3.14); //显示调用一个参数的构造函数
    A a2 = 2.56;
    cout << "a1.m_val = " << a1.m_val << endl;
    cout << "a2.m_val = " << a2.m_val << endl;
    cout << "_________________________________________" << endl; 
    system("pause");
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xbdqQwam-1655694461512)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220508191241980.png)]

上例中,A a2 = 2.56 就进行了一次隐式转换,转换方式为创建一个临时的对象,再进行赋值

A temp(2.56);
a2 = temp;

explicit关键字可以阻止构造函数的隐式转换,只对:只含有一个参数,或n个参数里面,有n-1个参数是带有默认值的构造函数才有效

error: conversion from ‘double’ to non-scalar type ‘A’ requested

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nIr1yslA-1655694461513)(C:\Users\86187\AppData\Roaming\Typora\typora-user-images\image-20220508191805771.png)]

可以看到,在我们添加了explicit关键字后,构造函数就不能再进行隐式转换了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值