C++ explicit 与 隐式类型转换

本文深入探讨C++中的隐式类型转换机制,包括自动类型提升、非布尔值到布尔类型的转换、初始化过程中的类型匹配,以及算术运算中的类型统一。特别分析了string类构造函数的隐式调用和explicit关键字如何抑制此类转换。

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

隐式类型转换

C++ 中的类型是可以相互转换的,编译器会自动地转换运算对象的类型:

  1. 在大多数的表达式中,比int类型小的整形值首先提升为较大的整数类型
  2. 在条件判断中,非布尔值转换成布尔类型
  3. 初始化过程中,初始值转换为变量的类型;在赋值语句中,右侧运算对象转换成左侧运行对象的类型。
  4. 如果算术运算或关系运算的运算对象有多种类型,需要转换为同一种类型
  5. 函数调用

explicit

结合explicit关键字可以很好地理解第3点。比如有string str = "123";  这语句中就是隐式调用了string 类的单参数构造函数。

string的单参数构造函数定义如下。(basi_string 就是syring,在 stl_string_fwd.h 中有定义 typedef basic_string<char>    string;

  basic_string(const basic_string& __s) : _Base(__s.get_allocator()) 
    { _M_range_initialize(__s.begin(), __s.end()); }

这个就是上面第3点的例子。

在添加了explicit之后会怎样?explicit的作用的抑制构造函数定义的隐式转换,vector中的单参数构造函数添加了explicit定义。所以 vector<int> v = 1 ; 这种语句会出现编译错误,我们只能够使用 vector<int> v(1);

  explicit vector(size_type __n)
    : _Base(__n, allocator_type())
    { _M_finish = uninitialized_fill_n(_M_start, __n, _Tp()); }

此前怀疑是由于string可能存在无参数构造函数,但是看源码发现string没有无参的构造函数,进一步证实了explicit的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值