手机表白网站在线制作,有哪些做包装设计网站好些,百度提交入口网站怎么看,wordpress打不开后台今天来学习类型转换函数。
一回顾
我们学习C语言的时候#xff0c;都知道#xff0c;标准的数据类型之间#xff0c;是可以做类型的转换的。分为隐式类型转换和强制类型转换。那么强制类型转换呢#xff0c;比较简单。但是隐式类型转换#xff0c;却存在诸多问题。下面我…今天来学习类型转换函数。
一回顾
我们学习C语言的时候都知道标准的数据类型之间是可以做类型的转换的。分为隐式类型转换和强制类型转换。那么强制类型转换呢比较简单。但是隐式类型转换却存在诸多问题。下面我们看一下隐式类型转换是如何转换的 转换规则如下 隐式类型转换只能是小类型转换为大类型这样可以避免数据的损坏不完整。上图显示的就是只能朝着箭头方向进行隐式的类型转换而不能反过来进行隐式转换。
下面还是先分析一个例子
#include iostream
#include stringusing namespace std;int main()
{ short s a; //char类型可以隐式的转换为short类型unsigned int ui 1000; //int类型可以隐式的转换为unsigned int类型。int i -2000; double d i; //int型可以隐式的转换为double类型cout d d endl;cout ui ui endl;cout ui i ui i endl;//这里我们预期应该是得到负的值但是结果却不是if( (ui i) 0 ){cout Positive endl;}else{cout Negative endl;}cout sizeof(s b) sizeof(s b) endl;/* 这里s为short类型2字节‘b’为char类型1字节做加法运算后char类型为什么没有隐式转换* short类型呢而是将这两个类型都转换为int类型因为编译器认为int类型的计算是* 最为高效的而short类型与char类型转换为int类型又是安全可行的所以编译器就直接把* 他们转换为int类型进行计算*/return 0;
}运行结果为 d -2000 ui 1000 ui i 4294966296 Positive sizeof(s ‘b’) 4
分析 程序的分析上面已经写的很清楚了。从此也可以看出隐式转换存在一定的隐患。
二再论构造函数
问题 普通类型与类类型之间能否进行类型转换类类型之间能否进行类型转换
回答 当然是可以的只不过这里需要先引入一个概念转换构造函数。那么什么是转换构造函数呢
我们知道构造函数可以有不同类型的参数当参数满足下列条件时成为转换构造函数
有且仅有一个参数参数是基本类型参数是其他类型
那么转换构造函数有什么意义呢在说明转换构造函数之前我们看一下下图 上图说明C方式中的旧标准普通类型之间进行的强制类型转换的格式以及类似的类类型与普通类型之间的转换的格式。上图类类型的转换实际上是属于隐式类型的转换可以详细看一下视频课程中的逐步索引这里我就直接给出结论了但是隐式类型转换呢在工程开发中是存在诸多隐患的是程序中BUG的重要来源。
所以我们一般在开发中都不使用隐式转换而使用显示转换
转换构造函数被explicit修饰时只能进行显示转换
转换方式 static_cast(value);ClassName(value); //不推荐
说了这么多还是直接写代码分析吧
#include iostream
#include stringusing namespace std;class Test
{int mValue;
public:Test(){mValue 0;}explicit Test(int i) //转换构造函数{mValue i;}Test operator (const Test p){Test ret(mValue p.mValue);return ret;}int value(){return mValue;}
};int main()
{ Test t;t static_castTest(5); // t Test(5);显示转换cout t.value() endl;Test r;r t static_castTest(10); // r t Test(10); 显示转换cout r.value() endl;return 0;
}运行结果为 5 15
分析与结论 上面的程序可以看出当我们想让普通类型int类型与类类型的值进行运算时首先需要把int类型转换为类类型转化为一个临时的类类型然后再进行运算。类类型的转换需要显示进行前面加上前缀static_castcalss(int),就可以进行转换了同时呢转换还需要一个转换构造函数转换构造函数前面也需要加上前缀explicit。转换的时候是调用这个转换构造函数进行转换的。
三总结
转换构造函数只有一个参数转换构造函数的参数类型是其他类型转换构造函数在类型转换时被调用隐式类型转换时工程中BUG的重要来源explicit关键字修饰转换构造函数只能进行显示转换防止隐式转换的出现杜绝BUG
想一起探讨以及获得各种学习资源加我有我博客中写的代码的原稿 qq1126137994 微信liu1126137994 可以共同交流关于嵌入式操作系统C语言C语言数据结构等技术问题。