一、类型转换
1、隐式类型转换
char c='A'; int i=c;
在上述这一段代码中,发生了char到int的隐式类型转换,不止如此,在参数传递,返回值等地方也可能存在隐式转换。
2、显式类型转换
(1)强制类型转换
char c='A'; int i=(int)c;//c语言风格 int i=int(c);//c++风格
(2)C++在兼容C强制转换的同时,同时增加四种操作符形式的类型转换
C++中四种操作符形式的类型转换:
(1)静态类型转换
目标类型变量=static_cast<目标类型>(源类型变量)
使用场景:可以将void *转换为其他类型的指针。。。
int a; void * pv=&a;//c++编译器ok,c编译器ok int *p=pv;//c++编译器报错,c编译器ok//解决方法如下
int* pa=(int*)pv;
int* pa=static_cast<int*>(pv);//double->int无法完成(2)动态类型转换
目标类型变量=dynamic_cast<目标类型>(源类型变量):
动态类型转换会对转换的数据类型进行检查。动态类型转换不支持基础数据类型间的转换,不支持无继承关系的两个类型之间的指针或引用转换,对于有继承关系的两个类,只支持向上转换(子类转父类),不支持向下转换(父类转子类)。
(3)常类型转换
目标类型变量=const_cast<目标类型>(源类型变量)
使用场景:去除一个引用或者指针的常属性
const volatile int a=10;//如果不加volatile,下面修改a的值的时候将失败,它的作用是防止编译器优化,因为一个常量会被加载到寄存器中,以避免多次读取 const int * pa=&a; *pa=20;//无法编译通过,a的值是常量 int * pa2 =const_cast<int *>(&a);//ok *pa2=20;//去除a的常属性
注意:
当c++编译器无法识别数据类型时,有可能会将其认为是布尔类型,此时只需将其转换为可识别类型即可。
(4)重解释类型转换
目标类型变量=reinterpret_cast<目标类型>(源类型变量)
适用场景:任意类型的指针或引用的转换;指针和整数之间的转换等
整数转换为指针:
//*(int *)0xE0200080=123;在C++中可以使用下面的语句完成 int addr 0xE0200080; int * paddr=reinterpret_cast<int *>(addr); *paddr=123;任意类型指针的转换:
struct Data{
char type[5];
char acc[9];
char passwd[7];
};
char text[]="0001 0012345678 00888888"
Data * pdata=reinterpret_cast<Data*>(text);//此时可以使用pdata来进行操作。
二、总结
1、小心使用宏
可以使用const、enum、inline替换,因为宏对全局可见。如:
#define PAI 3.14; --->const double PAI =3.14; #define ERROR 0; #define SUCCEDD 1;---->num 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、使用string来表示字符串