时间:2021-05-20
1 operator隐式类型转换
1.1 std::ref源码中reference_wrapper隐式类型转换
在std::ref的实现中有如下一段代码:
template<typename _Tp> class reference_wrapper : public _Reference_wrapper_base<typename remove_cv<_Tp>::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... _Args> 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 <iostream>/* * * 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 <iostream>/* * * 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++ Primer》隐式类类型转换学习整理
以上就是C++中隐式类型转换学习笔记的详细内容,更多关于C++中隐式类型转换的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C#中,有些类型是可以隐式转换的,我整理了这些可以隐式转换的类型,供大家参考复制代码代码如下:staticprivateboolCanConvert(Typef
C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。c++规定:
1.隐式类型转换的问题隐式类型转换是C++一个让人又爱又恨的特性,使用方便,但可能会降低代码可读性,甚至会造成一些十分隐晦的错误。#includeusingna
显式转换与隐式转换类型之间的转换可以分为隐式转换与显式转换,如int类型可直接转换为long类型。复制代码代码如下:intintNum=23;l
C#用户定义类型转换•用于自定义类和结构能够进行隐式转换和显示转换.例如:将一个自定义类类型转换成整型,浮点型等,反之亦然.C#提供隐式转换和显式转