C++学习笔记(9)explicit显式声明

语法

explicit
explicit ( expression )

expression:根据上下文可以转换为bool类型的表达式

用法

  1. 指明构造函数、转换函数或推断指引(deduction guide)为显式,即不能用于隐式转换和复制初始化
  2. explicit说明符可以与常量表达式一起使用,当且仅当该常量表达式求值为 true 时,函数是显式的。可以理解为使用explicit的前提条件
  3. explicit说明符只能在类定义的构造函数或转换函数的del-specifier-seq中出现

注解

转换构造函数

声明时不带explicit说明符的拥有单个无默认值形参(parameter)的构造函数
构造函数(除了复制或移动)和用户定义转换函数都可以是函数模板;explicit 的含义不变。
在这里插入图片描述

示例

struct A
{
	A(int) {} // converting constructor
	A(int, int) {} // converting constructor
	operator bool() const {return true;}
};
struct B
{
	explicit B(int) {}
	explicit B(int, int) {}
	explicit operator bool() const {return true;}
}

int main()
{
	A a1=1; // ok: copy-initialization
	B b1=1; // error: explicit 不允许 copy-initialization
	A a2(2); // ok: direct-initialization
	B b2(2); // ok: direct-initialization
	A a3={4,5}; // ok: copy-list-initialization
	B b3={4,5}; // error: explicit不允许copy-list-initialization
	A a4{4,5}; // ok: direct-list-initialization
	B b4{4,5}; // ok: direct-list-initialization
	if (a1) { } // ok: A::operator bool()
	if (b1) { } // ok: B::operator bool()

	bool na1 = a1; // OK:复制初始化选择 A::operator bool()
    bool na2 = static_cast<bool>(a1); // OK:static_cast 进行直接初始化
    bool nb1 = b2; // 错误:复制初始化不考虑 B::operator bool()
    bool nb2 = static_cast<bool>(b2); // OK:static_cast 进行直接初始化
 
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值