C++四种类型转换总结
C风格的强制类型转换很简单,均用 Type b = (Type)a 形式转换。C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用,如下表:
| 转换类型操作符 | 作用 |
| const_cast | 去掉类型的const或volatile属性 |
| static_cast | 无条件转换,静态类型转换 |
| dynamic_cast | 有条件转换,动态类型转换,运行时检查类型安全(转换失败返回NULL) |
| reinterpret_cast | 仅重新解释类型,但没有进行二进制的转换 |
1、const_cast
去掉类型的const或volatile属性
int main() {
struct T {
int i;
};
const T a;
//a.i = 10; //直接修改const类型,编译错误
T &b = const_cast<T&>(a);
b.i = ;
return ;
}
2、static_cast
类似C风格的强制转换,进行无条件转换,静态类型转换:
1)基类和子类之间的转换:其中子类指针转换为父类指针是安全的,但父类指针转换为子类指针是不安全的(基类和子类之间的动态类型转换建议用dynamic_cast)。
2)基本数据类型转换,enum,struct,int,char,float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。
3)把任何类型的表达式转换成void类型。
4)static_cast不能去掉类型的const、volatile属性(用const_cast)。
int main() {
int n = ;
double d = static_cast<double>(n); //基本类型转换
int *pn = &n;
double *d = static_cast<double*>(&n); //无关类型转换,编译错误
void *p = static_cast<void*>(pn);
return ;
}
3、dynamic_cast
有条件转换,动态类型转换,运行时检查类型安全(转换失败返回NULL):
1)安全的基类和子类之间的转换。
2)必须有虚函数。
3)相同基类不同子类之间的交叉转换,但结果返回NULL。
class Base {
public:
int _i;
virtual void foo() {}; //基类必须有虚函数。保持多态特性才能使用dynamic_cast
};
class Sub : public Base {
public:
char *_name[];
void Bar() {};
};
int main() {
Base* pb = new Sub();
Sub* ps1 = static_cast<Sub*>(pb); //子类->父类,静态类型转换,正确但不推荐
Sub* ps2 = dynamic_cast<Sub*>(pb); //子类->父类,动态类型转换,正确
Base* pb2 = new Base();
Sub* ps21 = static_cast<Sub*>(pb2); //父类->子类,静态类型转换,危险!访问子类_name成员越界
Sub* ps22 = dynamic_cast<Sub*>(pb2);//父类->子类,动态类型转换,安全,但结果为NULL
return ;
}
4、reinterpret_cast
仅重新解释类型,但没有进行二进制的转换:
1)转换的类型必须是一个指针,应用、算术类型、函数指针或者成员指针。
2)在比特级别上进行转换,可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。
3) 最普通的用途就是在函数指针类型之间进行转换。
4) 很难保证移植性。
int doSomething() {
return ;
};
int main() {
typedef void(*FuncPtr)(); //FuncPtr is 一个指向函数的指针,该函数没有参数,返回值类型为 void
FuncPtr funcPtrArray[]; //10个FuncPtrs指针的数组 让我们假设你希望(因为某些莫名其妙的原因)把一个指向下面函数的指针存入funcPtrArray数组:
funcPtrArray[] = &doSomething;// 编译错误!类型不匹配,reinterpret_cast可以让编译器以你的方法去看待它们:funcPtrArray
funcPtrArray[] = reinterpret_cast<FuncPtr>(&doSomething); //不同函数指针类型之间进行转换
return ;
}
总结
去const属性用const_cast
基本类型转换用static_cast
多态类之间的类型转换用dynamic_cast
不同类型的指针类型转换用reinterpret_cast
C++四种类型转换总结的更多相关文章
- C++ 四种类型转换
在写代码中经常会有很多的隐式类型转换或显式类型转换. 对于隐式的类型转换主要是放生在赋值的时候,讲变量赋值给不同类型的变量的时候就会发生类型转换,如果是宽化转换(即从占字节少的类型向占字节多的类型转换 ...
- [转]C++中四种类型转换符的总结
C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression) reinterpret_cast操 ...
- 从零开始学C++之从C到C++(二):引用、内联函数inline、四种类型转换运算符
一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型 &引用名 = 变量名: 例如:int a=1; int &b=a;// b是a的别名,因此a和b是同一个单元 注 ...
- c++ --> c++中四种类型转换方式
c++中四种类型转换方式 c风格转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少缺点, 1)它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向 ...
- 【转】C++四种类型转换方式
C++四种类型转换方式 https://blog.csdn.net/lv_amelia/article/details/79483579 C风格的强制类型转换(Type Case)很简单,不管什么类型 ...
- C++语言中的四种类型转换
1 引子 这篇笔记是根据StackOverflow上面的一个问题整理而成,主要内容是对C/C++当中四种类型转换操作进行举例说明.在之前其实对它们都是有所了解的,而随着自己在进行总结,并敲了一些测试示 ...
- 引用、数组引用与指针引用、内联函数inline、四种类型转换运算符
一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型 &引用名 = 变量名: 例如:int a=1; int &b=a;// b是a的别名,因此a和b是同一个单元 ...
- C++中四种类型转换以及const_cast是否能改变常量的问题
we have four specific casting operators:dynamic_cast, reinterpret_cast, static_cast and const_cast. ...
- 【C++】类型转换简述:四种类型转换方式的说明及应用
本文主要简述在C++中四种类型转换的方式:static_cast.reniterpret_cast.const_cast和dynamic_cast. 在介绍C++类型转换方式之前,我们先来看看C语言的 ...
- C++四种类型转换方式。
类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...
随机推荐
- javascript类型判断最佳实践
javascript有8种数据类型 值类型 Number Null Undefined String Symbol Boolean BigInt 引用类型 Object Array Function ...
- Linux 打印可变参数日志
实现了传输进去的字符串所在的文档,函数和行数显示功能. 实现了将传入的可变参数打印到日志功能. #include<stdio.h> #include<stdarg.h> #in ...
- [题解] [SCOI2010] 生成字符串
题面 题解 考虑到直接求合法方案不好求, 我们转化为用总方案减去不合法方案 总方案就是\(\binom{n+m}{m}\), 即在\(n+m\)个位置中放\(n\)个数 我们将初始的空序列看做\((0 ...
- tp5中很牛皮的一句sql语句,三个条件(两个不确定条件,一个硬性条件)
$result = Db::table('xxxxxx') // 表名 ->alias('g') ->join('xxxxx_2 u','g.user_id = u.id') -> ...
- char能不能存储一个汉字
答案是肯定的 请参见博客:https://www.cnblogs.com/1017hlbyr/p/6419016.html
- LC 890. Find and Replace Pattern
You have a list of words and a pattern, and you want to know which words in words matches the patter ...
- 使用SlidingDrawer(滑动式抽屉)实现抽屉效果
SlidingDrawer隐藏屏外的内容,并允许用户通过handle以显示隐藏内容.它可以垂直或水平滑动,它有俩个View组成,其一是可以拖动的handle,其二是隐藏内容的View.它里面的控件必须 ...
- 使用谷歌提供的SwipeRefreshLayout下拉控件,并自定义实现下拉加载的功能
package com.loaderman.swiperefreshdemo; import android.os.Bundle; import android.os.Handler; import ...
- 1.Oracle 11g 精简客户端
大型项目开发中,当属Oracle的使用率最高.通常开发人员的机器上都会装上一个 oracle客户端,但一般我们不会再自己的机器上安装Oracle database,因为我们的项目中有专为开发使用的or ...
- [git]查看一个git项目的仓库位置
项目文件夹的根目录下查找.git文件夹.打开config文件,里面的remote部分就是: [core] repositoryformatversion = 0 filemode = false ba ...