C++-类型转换、类和对象、类的定义和实例化(day3)

一、类型转换

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\00012345678\000888888"

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来表示字符串



猜你喜欢

转载自www.cnblogs.com/ptfe/p/11235419.html
今日推荐