C++学习笔记8——新的类型转换
2018-03-06 13:16
218 查看
强制类型转换
C方式强制类型转换存在的问题过于粗暴
任意类型之间都可以进行转换, 编译器很难判断其正确性
难于定位
在源码中无法快速定位所以使用强制类型转换的语句
C++将强制类型转换分为 4 种不同的类型
static_cast强制类型转换用于基本类型间的转换
不能用于基本类型指针间的转换
用于有继承关系类对象之间的转换和类指针之间的转换
const_cast强制类型转换
用于去除变量的只读属性
强制类型的目标类型必须是指针或引用
reinterpret_cast强制类型转换
用于指针类型间的强制类型转换
用于整数和指针类型间的强制转换
dynamic_cast强制类型转换
用于有继承关系的类指针间的转换
用于有交叉关系的类指针间的转换
具有类型检查的功能
需要虚函数的支持
/* 测试代码 */ #include <stdio.h> void static_cast_demo() { int i = 0x12345; char c = 'c'; int* pi = &i; char* pc = &c; c = static_cast<char>(i); // ok // pc = static_cast<char*>(pi); // error static_cast不能用于基本类型指针间的转换 } void const_cast_demo() { const int& j = 1; int& k = const_cast<int&>(j); // ok const int x = 2; int& y = const_cast<int&>(x); //ok // int z = const_cast<int>(x); // error const_cast强制类型的目标类型必须是指针或引用 k = 5; printf("k = %d\n", k); // 5 printf("j = %d\n", j); // 5 y = 8; printf("x = %d\n", x); // 2 常量 printf("y = %d\n", y); // 8 printf("&x = %p\n", &x); printf("&y = %p\n", &y); } void reinterpret_cast_demo() { int i = 0; char c = 'c'; int* pi = &i; char* pc = &c; pc = reinterpret_cast<char*>(pi); // ok pi = reinterpret_cast<int*>(pc); // ok pi = reinterpret_cast<int*>(i); // ok // c = reinterpret_cast<char>(i); // error reinterpret_cast不能用于基本类型间的转换 } void dynamic_cast_demo() { int i = 0; int* pi = &i; // char* pc = dynamic_cast<char*>(pi); // error dynamic_cast需要虚函数的支持 } int main() { static_cast_demo(); const_cast_demo(); reinterpret_cast_demo(); dynamic_cast_demo(); return 0; }
运行结果
k = 5 j = 5 x = 2 y = 8 &x = 0022FF1C &y = 0022FF1C
相关文章推荐
- C++学习笔记:类型转换
- C++ 学习笔记(14)重载运算与类型转换、函数对象、function库
- c++学习笔记--类型转换运算符
- C++ Primer 学习笔记_64_满载操作符与转换 -转换与类类型【下】
- 【C++】学习笔记草稿版12(类对象的类型转换)
- C++中的类型转换学习笔记
- C++基础的不能再基础的学习笔记——类型转换
- C++ 学习笔记(4)表达式、运算符、类型转换(static_cast、const_cast、reinterpret_cast、dynamic_cast)
- C++学习笔记之——显示类型转换(static_cast,const_cast,interpret_cast,dynamic_cast)
- C++学习笔记之类型转换
- 【从C到C++学习笔记】内敛函数/内敛函数与带参数宏的区别/新的类型转换运算符
- c++学习笔记:使用锋利的sstringstream完成类型转换
- 【C++学习笔记】07_类型转换
- C++学习笔记【第三部分第十四章:重载运算与类型转换】
- 《C++ Primer Plus》15.5 类型转换运算符 学习笔记
- C++学习笔记:类型转换dynamic)cast和reinterpret_cast
- c++学习笔记——一种非法的类型转换
- 【C++学习笔记】类型转换和跳转语句
- C++学习笔记十七 - 简单的类型强制转换
- C++学习笔记(八)类型转换