C++ explicit 与 隐式类型转换

隐式类型转换

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的作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章