网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

C++中隐式类型转换的示例分析

这篇文章主要介绍C++中隐式类型转换的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

常德网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站等网站项目制作,到程序开发,运营维护。成都创新互联自2013年起到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联

1 operator隐式类型转换

1.1 std::ref源码中reference_wrapper隐式类型转换

在std::ref的实现中有如下一段代码:

template
 class reference_wrapper
 : public _Reference_wrapper_base::type>
 {
  _Tp* _M_data;

 public:
  typedef _Tp type;

  reference_wrapper(_Tp& __indata) noexcept
  : _M_data(std::__addressof(__indata))
  { }

  reference_wrapper(_Tp&&) = delete;

  reference_wrapper(const reference_wrapper&) = default;

  reference_wrapper&
  operator=(const reference_wrapper&) = default;
  //operator的隐式类型转换
  operator _Tp&() const noexcept
  { return this->get(); }

  _Tp&
  get() const noexcept
  { return *_M_data; }

  template
 typename result_of<_Tp&(_Args&&...)>::type
 operator()(_Args&&... __args) const
 {
  return __invoke(get(), std::forward<_Args>(__args)...);
 }
 };

注意看operator操作符重载:

operator _Tp&() const noexcept
  { return this->get(); }

就是用于类型转换。

1.2 简单的例子-实现一个class转为int的示例

#include 
/*
 *
 * c++ operator的隐式类型转换
 * 参见std::ref的实现
 */ 
void f(int a)
{
 std::cout << "a = " << a << std::endl;
}
class A{
 public:
 A(int a):num(a){}
 ~A() {}

 operator int()
 {
  return num;
 }
 int num;
};

int main()
{
 A a(1);
 std::cout << a + 1 << std::endl;
 f(a);
 return 0;
}

当然除了通过operator实现隐式类型转换,c++中还可以通过构造函数实现。

2 构造函数实现隐式类型转换

在c++ primer一书中提到

可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个转换

看如下示例:

#include 
/*
 *
 * c++ 构造的隐式类型转换
 * 参见std::ref的实现
 */
class B{
 public:
 B(int a):num(a){}
 ~B() {}

 int num;
};

class A{
 public:
 A(int a):num(a){}
 A(B b):num(b.num){}
 ~A() {}

 int fun(A a)
 {
  std::cout << num + a.num << std::endl;
 }

 int num;
};

int main()
{
 B b(1);
 A a(2);
 //通过构造函数实现了隐式类型转换
 a.fun(b); //输出结果为3
 return 0;
}

特别需要注意的是单个实参,构造函数才会有隐式转换,一个条件不满足都是不行。

3 使用explicit关键字避免构造函数隐式转换

有些时候我们并不希望发生隐式转换,不期望的隐式转换可能出现意外的结果,explicit关键词可以禁止之类隐式转换,将上述class A的构造函数改为如下

class A{
 public:
 A(int a):num(a){}
 explicit A(B b):num(b.num){}
 ~A() {}

 int fun(A a)
 {
  std::cout << num + a.num << std::endl;
 }

 int num;
};

再次运行程序出现提示:

op2.cpp: In function ‘int main()':
op2.cpp:29:12: error: no matching function for call to ‘A::fun(B&)'
a.fun(b);
^
op2.cpp:16:9: note: candidate: int A::fun(A)
int fun(A a)
^~~
op2.cpp:16:9: note: no known conversion for argument 1 from ‘B' to ‘A'

这个时候调用方式修改更改为:

int main()
{
 B b(1);
 A a(2);
 a.fun(A(b));
 return 0;
}

以上是“C++中隐式类型转换的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!


当前名称:C++中隐式类型转换的示例分析
网站URL:http://bjjierui.cn/article/igjsis.html

其他资讯