C++中的强制类型转换
来源:互联网 发布:惠州网络英才网 编辑:程序博客网 时间:2024/06/13 05:52
C中的隐式类型转换和强制类型转换
void Test(){ int i = 1; //隐式类型转换 double d = i; printf("%d,%.2f\n", i, d); int* p = &i; //强制类型转换 int address = (int)p; printf("%x,%d\n", p, address);}
C++中的强制类型转换。
static_cast; reinterpret_cast; const_cast ;dynamic_cast;
static_cast:
该运算符把expression转换成type-id类型,没有运行时类型检查来保护转换的安全性。
用于:
类层次结构中基类和派生类之间指针或引用的转换。
向上转换(把派生类的指针或引用转换成基类表示)是安全的
向下转换(把基类指针或引用转换成派生类表示)由于没有动态类型转换是不安全的。用于基本数据类型之间的转换。
- 把空指针转换成目标类型的空指针
- 把任何类型的表达式转换成void类型
用法:
static_cast(expression);
1.C++中的static_cast执行非多态的转换,被作为显示类型转换使用。
int i;float = 166.71;i = static_cast<int>(f);
reinterpret_cast;
reinterpret_cast操作符用于将一种类型转换为另一种不同的类型。
所谓“通常为操作数的位模式提供较底层的重新解释”也就是说将数据以二进制存在的形式重新解释。
reinterpret(重新解释)
void Test(){ int i; char* p = "This is a Sample"; i = reinterpret_cast<int> (p); cout << i << endl;}
const_cast
const_cast最常用的用途就是删除变量的const属性,方便赋值。
void Test(){ const int a = 3; int *p = const_cast<int*>(&a); *p = 5; cout << a << endl;}
dynamic_cast
dynamic_cast用于将一个父类对象的指针(或引用)转换为
子类对象的指针或引用(动态转换)
向上转型:子类对象指针->父类指针/引用
向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的)
- dynamic_cast只能用于含有虚函数的类。
- dynamic_cast会先检查是否能转型成功,能成功则转换,不能则返回0.
class A{public: virtual void f() {}};class B{};void fun(A* Pa){ //B* pb1 = static_cast<B*>(Pa); B* pb2 = dynamic_cast<B*> (Pa); cout << "pb2" << pb2 << endl;}void Test(){ A a; B b; fun(&a);// fun(&b);}
explicit关键字
explicit关键字阻止经过转换构造函数进行的隐式转换的发生。
class A{public: explicit A(int a) { cout << "A(int a)" << endl; } A(const A& a) { cout << "A(const A&a)" << endl; }private: int _a;};void Test(){ A a1(4); // A a2 = 1; //不能执行通过}
阅读全文
0 0
- C中的类型强制转换
- [强制类型转换]C语言中的强制类型转换相关
- C语言中的强制类型转换
- 关于c语言中的强制类型转换
- C语言中的强制类型转换
- c++-----强制类型转换
- 【C++】强制类型转换
- C 强制类型转换
- C 强制类型转换
- C 强制类型转换
- C/C++强制类型转换中的安全隐患一例
- C++中的强制类型转换
- C++中的类型强制转换
- C++中的强制类型转换
- Java中的强制类型转换
- AS3中的强制类型转换
- C++中的强制类型转换
- c++中的强制类型转换
- Android 拷贝db文件到sqlite数据库。
- Android Studio 超级简单的打包生成apk
- Java设计模式之三:工厂方法模式
- redis常见面试题
- Java实训第9天(面向对象)
- C++中的强制类型转换
- MaterialDesign学习篇(一),MaterialDesign的介绍
- 我已看破【词汇的奥秘】
- 操作封装的SQL链接——MyBatis
- Gerrit Replication Reject HostKey 解决方法
- java---继承
- 通过反射和缓存区对一个类中的私有属性,私有方法进行设值,取值操作
- LAMP搭建之Apache(源码安装)
- Java并发多线程面试题 Top 50