C++类型转换
1. 隐式类型转换
char c = 'A';
int i = c; //隐式类型转换
int foo(int n) {
return c;//隐式类型转换
}
int main(void){
foo(c); //隐式类型转换
}
2.显示类型转换
2.1 C 语言显示类型转换(强制类型转换)
int a = 0xE0200080;
int *p = (int *)a;
char c;
int i = (int)c; //C 风格的强制转换
int i = int(c); //C++风格的强制转换
2.2 C++语言显示类型转换
兼容 C 语言类型转换的同时增加了四种操作符的形式。
(1) 静态类型转换
目标类型变量 = static_cast<目标类型>(源类型变量);
主要用于将 void* 转化为其它类型的指针
int a;
void* pv = &a;
int* pi = static_cast<int*>(pv); //ok
double* pv = static_cast<double*>(pi); //error
A 类型 ==> B 类型可以隐式转换
B 类型 ==> A 类型可以静态转换
(2) 动态类型转换
目标类型变量 = dynamic_cast<目标类型>(源类型变量);
主要用于将基类的指针或引用安全地转换成派生类的指针或引用,并用派生类的指针或引用调用非虚函数。
(3) 常量类型转换
目标类型变量 = const_cast<目标类型>(源类型变量);
主要用于去除指针或引用的常属性。
const int a = 10;
const int* p = &a;
*p = 20; //error
int* p2 = const_cast<int*>(p);
*p2 = 20; //ok
const int& r = a;
r = 30; //error
int& r2 = const_cast<int&>(r);
r2 = 30; //ok
(4) 重解释类型转换
目标类型变量 = reinterpret_cast<目标类型>(源类型变量);
A.任意类型的指针或引用之间进行转换
B.在指针和整型数之间的转换
int a;
int* pa = &a;
double* pd = reinterpret_cast<double*>(pa);
=============
小结:从C 到 C++ 的一些建议
1 慎用宏
#define PAI 3.14
==>
const double PAI = 3.14
#define ERROR 0
#define SUCCESS 1
==>
enum STATE{ERROR,SUCCESS}
#define max(a,b)((a)>(b)?(a):(b))
==>
inline int max(int a,int b){
return a > b ? a:b;
}
2 变量随用随声明同时初始化
3 尽量使用 new/delete 取代 malloc/free
4 少用 void*,指针计算、联合体和强制类型转换
5 少用 c 风格的 char*,多用 string 表示字符串