文章目录
类型转换
隐式类型转换
显式类型转换
C++兼容C中的强制类型转换
增加了四种操作符形式显式转换
小结(C++之父给C程序员建议)
代码示例
类型转换
隐式类型转换
char c = 'A'; int i = c;//隐式 ------------- void func(int i){..} func(c);//隐式 ------------- int func(void){ char c = 'A'; return c;//隐式 }
显式类型转换
C++兼容C中的强制类型转换
char c = 'A'; int i = (int)c;//C风格强制转换 int i = int(c);//C++风格强制转换
增加了四种操作符形式显式转换
- 静态类型转换
- 语法形式:
- 目标类型变量 = static_cast<目标类型>(源类型变量);
- 使用场景:
- //用于将void*转换为其它类型的指针
int a=100; void* pv = &a; int* pi = static_cast<int*>(pv);
- 动态类型转换
- dynamic_cast - 运行时类型检查。可以父子之间转换,也可以兄弟之间转换。优点是安全,缺点是运行时效率低。
- 常类型转换
- 语法形式:
- 目标类型变量 = const_cast<目标类型>(源类型变量);
- 使用场景:
- 用于去除一个指针或引用的常属性
- 重解释类型转换
- 语法形式:
- 目标类型变量 = reinterpret_cast<目标类型>(源类型变量);
- 使用场景:
- –》任意类型指针或引用之间转换
- –》在指针和整型数之间转换
- eg:向物理内存0x12345678存放数据123?
int* paddr = reinterpret_cast<int*>(0x12345678); *paddr = 123;
小结(C++之父给C程序员建议)
- 慎用宏,使用const、inline、enum替换
#define PAI 3.14 --> const double PAI = 3.14; #define max(a,b) ((a)>(b) ? (a):(b)) --> inline int max(int a,int b){ return a>b ? a:b; } #define STATE_SLEEP 0 #define STATE_RUN 1 #define STATE_STOP 2 --> enum STATE{SLEEP,RUN,STOP};
- 变量随用随声明同时初始化
- 尽量使用new/delete替换malloc/free
- 少用void*、指针计算、联合体和强制转换
- 尽量使用string表示字符串,少用C风格char*
代码示例
- static_cast.cpp
#include <iostream> using namespace std; int main(void) { int* pi = NULL; //char c = (long)pi;//C风格 char c = long(pi);//C++风格 void* pv = pi; //静态类型转换,合理:ok pi = static_cast<int*>(pv); //静态类型转换,不合理:error c = static_cast<long>(pi); return 0; }
- 执行结果
- const_cast.cpp
#include <iostream> using namespace std; int main(void) { /* volatile修饰的变量表示"易变的",告诉 * 编译器每次使用该变量时,都要从内存中 * 去读取,而不要使用寄存器副本,防止编 * 译器优化导致的错误结果*/ const volatile int ci = 10; int* pci = const_cast<int*>(&ci); *pci = 20; cout << "ci=" << ci << endl;//20 cout << "*pci=" << *pci << endl;//20 cout << "&ci=" << (void*)&ci << endl; cout << "pci=" << pci << endl; return 0; }
- 执行结果
- reinterpret_cast.cpp
#include <iostream> using namespace std; int main(void) { //"\000"->'\0'->0 char buf[] = "0001\00012345678\000123456"; struct T{ char type[5]; char id[9]; char passwd[7]; }; T* pt = reinterpret_cast<T*>(buf); cout << pt->type << endl;//0001 cout << pt->id << endl;//12345678 cout << pt->passwd << endl;//123456 return 0; }
- 执行结果