C++类型转换
来源:互联网 发布:淘宝引流软件有用吗 编辑:程序博客网 时间:2024/05/21 17:53
C++类型转换
隐式类型转换
隐式类型转换发生在以下情况:
在混合类型的算术表达式中,为了防止精度丢失,这种情况最宽的数据类型称为目标转换类型,这也被称为算术转换,例如int+double被转换成double
在进行整值提升时char , signed char , unsigned char , 和short int 都被提升为int ,,枚举类型被提升为能够表示其底层类型所有值的最小整数类型用一种类型的表达式赋值给另一种类型的对象,例如double a = 1.1,int b = a,a被截取为int
把一个表达式传递给一个函数,调用表达式的类型和形参的类型不同 例如 funtest(double n),调用函数:funtest(10)这里10被提升为double 类型10.0
从一个函数返回一个表达式的类型与返回值类型不同,这时候返回的类型自动转换成函数声明返回值的类型,例如:double funtest(){return 2;}这里2被提升为double类型2.0
强制类型转换
C风格的:(T)expression//将expression转型为T
函数风格的:T(expression)//将expression转型为T
C++新式转换:
- const_cast( expression )//用来移除对象的常量性,唯一有此能力的C++style转型操作符
- dynamic_cast( expression )//执行安全性下转型,用来决定某对象是否归属继承体系中的某个类型,唯一无法由旧式语法执行的动作,只能用于含有虚函数的类,成功则转换,不成功返回0
- reinterpret_cast( expression )//执行低级转型,不可移植,例如建一个int*转化成一个int
- static_cast( expression )//强迫隐式转型,例如将non-const对象转化成const 对象,int转化为double等,将void*转化为typed指针,将基类指针转化为派生类指针等
尽量使用新式转换:首先它很容易在代码中被辨识出来(不论人工还是grep工具),其次各转型动作的目标愈窄化,编译器愈可能诊断出错误的运用,比如打算将常量性去掉,除非使用const_cast否则无法通过编译
C++中的explicit关键字
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的
例如不使用explicit的类
class A{public: A(int n){};};A a = 10;//允许,隐式转换,相当于 A tmp(10), A a = tmpA a(1.1);//允许/****/void DoSoming(A a){}DoSoming(a);//允许DoSoming(10);//允许
使用explicit
class A{public: A(int n){};};A a = 10;//不允许A a(1.1);//允许/****/void DoSoming(A a){}DoSoming(a);//允许DoSoming(10);//不允许
当类的声明和定义分别在两个文件中时,explicit只能写在在声明中,不能写在定义中。
- <C/C++> 类型转换
- C/C++:类型转换
- C类型转换
- C#.NET 类型转换
- 类型转换(C#)
- C指针类型转换
- 类型转换--c语言
- C语言类型转换
- C语言类型转换
- C/C++类型转换
- C语言类型转换
- C++_类型转换
- objective-c 类型转换
- objective-c类型转换
- 标准C 类型转换
- c类型转换
- C类型转换
- c类型转换char2short
- 杨辉三角
- Deformable Convolutional Networks论文翻译——中文版
- 裕日面试题
- DFS(深度优先搜索树) 递归非递归实现
- Linux_别名与快捷键
- C++类型转换
- 色彩的意义
- 数据库悲观锁和乐观锁
- 第7节项目4-玩数字,求三个双精度实数的和,平均值,平方和以及平方和开方
- 大学计算机基础第五版习题和课后题答案
- json学习笔记------
- Lock源码解析
- 使用ZooKeeper实现数据发布/订阅。
- 机器和任务