C++|项目开发—强制类型转换回顾

Posted Charles梦想家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++|项目开发—强制类型转换回顾相关的知识,希望对你有一定的参考价值。

强制类型转换        

C++四种强制类型转换符:static_cast, reinterpret_cast, const_cast, dynamic_cast。

这四种强制类型转换的使用场合:

static_cast 

1、可用于强制隐型转换,如int转换为double、non-const对象转const对象。

2、可用于如void*指针转型为有类型的指针,父类指针转换为派生类指针,

3、注:它不能将一个const转换为non-const。

int num = 666888;  double num_static = static_cast<double>(n);   int *ptr = &num;  double *num = static_cast<double *>(&n)     //任意类型转换成void类型  void *p = static_cast<void *>(ptr); 

dynamic_cast 

1、一般用于执行"安全向下转型",也就是动态类型转换。如子类和父类之间的多态类型转换。主要用途:将基类的指针或引用安全地转换成派生类的指针或引用。

2、父类类型的指针变量不可向下调用派生类各个的成员(包含虚函数)。

3、注:子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。

class Base {  public:  int m_Num;  virtual void func(){};  };  class Derived: public Base {  public:    char *m_array[100];  void function(){};  };  Base* ptrb = new Derived();  Derived *ptrd = dynamic_cast<Derived *>(ptrb);    Base* pb = new Base();  Derived *pd = static_cast<DerivedClass *>(pb);

reinterpret_cast 

1、用于进行各种不同类型的指针之间、不同类型的引用之间以及指针和能容纳指针的整数类型之间的转换。

reinterpret_cast<type_id>(expression)int num = 0x00636261;//用16进制表示32位int,0x61是字符'a'的ASCII码  int * pnum = &num;  char * pstr = reinterpret_cast<char *>(pnum);  cout<<"pnum指针的值: "<<pnum<<endl;  cout<<"pstr指针的值: "<<static_cast<void *>(pstr)<<endl;//直接输出pstr会输出其指向的字符串,这里的类型转换是为了保证输出pstr的值  cout<<"pnum指向的内容: "<<hex<<*pnum<<endl;  cout<<"pstr指向的内容: "<<pstr<<endl;  return 0;

此例子参考https://zhuanlan.zhihu.com/p/33040213

const_cast 

一般用于强制取消对象的常量性,就是去掉const属性。

以上是关于C++|项目开发—强制类型转换回顾的主要内容,如果未能解决你的问题,请参考以下文章

c和c++中,对结构体进行强制类型转换!

关于强制类型转换(c语言)

C语言强制类型转换

C语言中的强制类型转换与机组的联系

C语言中的强制类型转换与机组的联系

JAVA 类型转换:隐式转换与强制转换