c/c++基础篇之数据类型转换
C/C++常见的数据类型转换
1. 常见的单类基本类型转换
(1)强制类型转换
如: int a=(int)(9.87) 结果a=9
char c=(char)(97) 结果为c=’a’
特别注意的是,在c++11中,增加了auto关键字,转换类型相对智能化
auto c=(int)(9.87) 结果c=9
(2)string与char * ,char arr[]
String----const char *
c_str()生成一个constchar*指针,指向以空字符终止的数组。
例1:const char *c; string s=”1234”; c=s.c_str();cout<<c; 输出结果为1234
例2:string str=”lol”; char * ptr=new char[str.length()+1]; strcat(ptr,str)
String---char s[]
可以利用strcpy函数(需先转换成constchar *)或者利用循环对字符数组逐一赋值
例:string s(‘test’);char str[10];
strcpy(str,s.c_str())
for(inti=0;i<s.length();i++) {str[i]=s[i]}
char s[]与char *------string
可以直接赋值 char *ptr; char arr[]; string s1=ptr; string s2=arr;
(3)char *与int
头文件:#include<stdlib.h>
atoi() 函数用来将字符串转换成整数(int),其原型为:intatoi (const char * str);
例:char *numchars="1234"; int num=atoi(numchars); 结果为1234
itoa()函数用于整数到字符串的转换,其原型为:char*itoa(int value, char *string, int radix);
例:int num=1234; int radix=8; char res[20]; itoa(num,res,radix);
printf("%d(10)=%s(%d)\n",num,res,radix);//输出1234(10)=2322(8) 这里radix指的是进制
同时c++还提供标准库函数有:long int atol ( const char * str ); double atof (constchar* str);
stof()、strtod()、strtol()、strtoul()、atoll()、strtof()、strtold()、strtoll()、strtoull(),详情可在网上查阅。
(4)string与int
利用stoi()直接转换
例:string s=”1234”;int b=stoi(s) 结果为1234
利用atoi()间接转换
例:string s=”1234”;int b=atoi(s.c_str()) 结果为1234
(5)sprintf作用是将printf的输出结果保存在字符串数组中。
2.一些特殊的数据类型转换
(1)type b= static_cast<type>(a) 将type1 a的类型转化为type2 b的类型;
使用范围:完成编译器认可的隐式类型转换,但不支持指针与常见的int、float等类型转换。
①基本数据类型之间的转换,如int->double;
int a = 6;
double b = static_cast<int>(a);
②派生体系中向上转型:将派生类指针或引用转化为基类指针或引用(向上转型);
class base{ …. }
class derived : public base{ …. }
base *b;
derived *d = new derived();
b = static_cast<base *>(d);
(2) dynamic_cast
功能:执行派生类指针或引用与基类指针或引用之间的转换。
格式:
①其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行运行时类型检查;
②不能用于内置的基本数据类型的强制转换。 dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
③使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。
这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念)中,只有定义了虚函数的类才有虚函数表。
④在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比 static_cast更安全。向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。可以实现向上转型和向下转型,前提是必须使用public或protected继承;
例子:
向上转型:
class base{ … };
class derived : public base{ … };
int main()
{
base *pb;
derived *pd = new derived();
pb = dynamic_cast<base *>(pd);
return 0;
}
向下转型:
class base{ virtualvoid func(){} };
class derived : public base{ void func(){} };
int main()
{ base*pb = new base();
derived *pd = dynamic_cast<derived*>(pb);//向下转型
return 0; }
(3) const_cast
只能对指针或者引用去除或者添加const属性,对于变量直接类型不能使用const_cast;不能用于不同类型之间的转换,只能改变同种类型的const属性。
如:
const int a= 0; int b = const_cast<int>(a);//不对的
const int *pi = &a; int * pii = const_cast<int *>pi;//去除指针中的常量性,也可以添加指针的常量性;
const_cast的用法:const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。
(4)reinterpret_cast
interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值.有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。
原文链接:https://blog.csdn.net/xiaomu_347/article/details/80584263
c/c++基础篇之数据类型转换的更多相关文章
- JAV基础语法之---数据类型转换
数制转换": 1.string 转 byte[] String str = "Hello";byte[] srtbyte = str.getBytes(); 2.byte ...
- JaveScript基础(2)之数据类型转换和常用字符串的操作方法
1.JaveScript数据类型转换: A.转字符串:通过"+"或toString(); PS:如果都是数值类型,'+'会进行求和运算,否则会做字符串连接: var s=2.5;d ...
- Java基础练习1(数据类型转换)
1.下列代码的输出结果是:()(单选) public static void main(String[] args){ double money = 3.0; money -= 2.9; System ...
- 02-Java基础语法【数据类型转换、运算符、方法入门】
重点知识记录 01.数据类型转换 当数据类型不一样是,将会发生数据类型转换. 1)自动类型转换(隐式): 特点:代码不需要进行特殊处理,自动完成: 规则:数据范围从小到大:byte < shor ...
- Go基础系列:数据类型转换(strconv包)
Go不会对数据进行隐式的类型转换,只能手动去执行转换操作. 简单的转换操作 转换数据类型的方式很简单. valueOfTypeB = typeB(valueOfTypeA) 例如: // 浮点数 a ...
- layui数据表格使用(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)
表格展示神器之一:layui表格 前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstrap table.layui table ...
- Python基础篇 -- 小数据池和再谈编码
小数据池 1. id() 通过id()可以查看到一个变量表示的值在内存中的地址 s = "Agoni" print(id(s)) # 2410961093272 2. is 和 = ...
- 转战物联网·基础篇03-从JSON数据到短指令谈思维的转变
了解了物联网项目的大体结构之后,我们先从物联网的联网相关部分说起,这也是物联网项目中的关键环节.在联网环节中,不仅要考虑如何连接上,还要考虑连接后如何传输数据.换句话说数据是以什么格式进行传输,对 ...
- cocos2dx基础篇(18) 数据存储CCUserDefault
在cocos2dx中提供了一个数据存储类CCUserDefault,可以作为一个轻量级的数据库来使用.它支持五种数据bool.int.float.double.string的存储. [3.x] ...
随机推荐
- 【每日一包0002】array-first
github地址:https://github.com/ABCDdouyae... array-first 获取数组的第一项或者前几项 文档地址:https://www.npmjs.com/packa ...
- 【重点突破】—— UniApp 微信小程序开发官网学习Two
一.使用Vue.js注意事项 Vue.js在uni-app中使用的差异: 新增:uni-app除了支持Vue实例的生命周期,还支持应用启动.页面显示等生命周期 受限:发布到H5时支持所有vue的语法, ...
- python 整数转字节 char
把10进制整数30,转换为字节 方法一 chr(30).encode() 结果 方法二 struct.pack('B', 30) 结果 准确地讲,Python没有专门处理字节的数据类型.但由于str既 ...
- 浏览器默认样式及reset
写在前面 首先纠正一个易错概念.div并非生来就是块元素,而是每个浏览器都有一套默认的css样式(优先级最低),默认样式里会把div设置成display: block;还有margin,padding ...
- Git - 对一组仓库进行配置
对一组仓库使用一套配置,另一组仓库使用另一套配置的需求也是有的,比如公司仓库的配置和我个人项目的仓库配置并不完全相同,每次都修改单个仓库的配置太麻烦并且可能会粗心忘改了以错误的配置进行提交,如何对一个 ...
- Python学习之==>发送邮件
自动化测试执行完成后,需要自动发送测试报告.Python发送邮件可以使用smtplib标准模块,但该模块比较繁琐,推荐使用yagmail这个第三方模块,用法比较简单. 一.邮箱设置 1.在邮箱设置里打 ...
- Delphi加密解密算法
// 加密方法一(通过密钥加密解密)function EncryptString(Source, Key: string): string;function UnEncryptString(Sourc ...
- ETF替代规则
0)禁止现金替代:是指在申购.赎回基金份额时,该成份证券不允许使用现金作为替代. 1)允许现金替代:是指在申购基金份额时,允许使用现金作为全部或部分该成份证券的替代,但在赎回基金份额时,该成份证券不允 ...
- Service层获取HttpServletRequest request
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/liuyunshengsir/article/details/78183058HttpServletR ...
- vue 中滚动div至最底部
scrollToBottom: function () { this.$nextTick(() => { var container = this.$el.querySelector(" ...