C++ explicit关键字总结(缝合版本)

  • 用来声明类构造函数是显示调用的,而非隐式调用,所以只用于修饰单参构造函数

  • 因为无参构造函数和多参构造函数本身就是显示调用的。再加上explicit关键字也没有什么意义, 但是也有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数。

  • 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).。

    官方说明:This keyword is a declaration specifier that can only be applied to in-class constructor declarations . An explicit constructor cannot take part in implicit conversions. It can only be used to explicitly construct an object 。

  • 意外发现该关键字还可以修饰operator

#include <iostream>
class A
{
public:
    /*explict*/ A(int n) //#2
    :m_a(n)
    {
    }
    /* explicit*/ operator int() //#1
    {
        return m_a;
    }
private:
    int m_a;
};

int main()
{
    A a1 = 10; //若#1处使用了explicit关键字,则此处编译失败。
    A a2(10);
    std::cout << "a2 is:" << a2 << std::endl;//若#2处使用了explicit关键字,则此处编译失败,必须修改为显示类型转换:(int)a
    return 0;
}
  • google的c++规范 中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以google约定所有单参数的构造函数都必须是显式构造的,只有极少数情况下拷贝构造函数可以不声明成explicit。例如作为其他类的透明包装器的类。
  • effective c++ 中提到被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。我鼓励你遵循相同的政策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值