C++的类型转换

举报
C语言与CPP编程 发表于 2021/08/28 00:14:28 2021/08/28
【摘要】 1 类型转换名称和语法 C 风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a  C++ 风格的类型转换提供了4 种类型转换操作符来应对不同场合的应用。 static_cast 静态类型转换。如int转换成char reint...

1 类型转换名称和语法

C 风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:

TYPE b = (TYPE)a 

 

C++ 风格的类型转换提供了4 种类型转换操作符来应对不同场合的应用。

  • static_cast 静态类型转换。如int转换成char

  • reinterpreter_cast 重新解释类型

  • dynamic_cast 命名上理解是动态类型转换。如子类和父类之间的多态类型转换。

  • const_cast, 字面上理解就是去const属性。 4种类型转换的格式:

TYPE B = static_cast<TYPE> (a) 

 

类型转换一般性介绍

1)static_cast<>() 静态类型转换,编译的时c++编译器会做类型检查;

基本类型能转换 但是不能转换指针类型

2)若不同类型之间,进行强制类型转换,用reinterpret_cast<>() 进行重新解释

3)一般性结论:

C语言中 能隐式类型转换的,在c++中可用 static_cast<>()进行类型转换。因C++编译器在编译检查一般都能通过;C语言中不能隐式类型转换的,在c++中可以用 reinterpret_cast<>() 进行强行类型 解释。

总结:static_cast<>()和 reinterpret_cast<>() 基本上把C语言中的 强制类型转换给覆盖reinterpret_cast<>()很难保证移植性。

4)dynamic_cast<>(),动态类型转换,安全的基类和子类之间转换;运行时类型检查

5)const_cast<>(),去除变量的只读属性

static_cast 用法和 reinterpret_cast 用法


  
  1. void main01()
  2. {
  3.  double dPi = 3.1415926;
  4.  //1静态的类型转换:  在编译的时 进行基本类型的转换 能替代c风格的类型转换 可以进行一部分检查
  5.  int num1 = static_cast<int> (dPi); //c++的新式的类型转换运算符  
  6.  int num2 = (int)dPi;    //c语言的 旧式类型转换 
  7.  int num3 = dPi;      //隐士类型转换
  8.  cout << "num1:" << num1 << " num2:" << num2 << " num3:" << num3 << endl;
  9.  char *p1 = "hello wangbaoming " ;
  10.  int *p2 = NULL;
  11.  p2 = (int *)p1;
  12.  //2 基本类型能转换 但是不能转换指针类型
  13.  //p2 = static_cast<int *> (p1); //“static_cast”: 无法从“char *”转换为“int *”
  14.  //3 可以使用  reinterpret_cast 进行重新解释 
  15.  p2 = reinterpret_cast<int *> (p1);
  16.  cout << "p1 " << p1 << endl;
  17.  cout << "p2 " << p2 << endl;
  18.  //4 一般性的结论: c语言中  能隐式类型转换的 在c++中可以用 static_cast<>()进行类型转换  //C++编译器在编译检查一般都能通过
  19.  //c语言中不能隐式类型转换的,在c++中可以用 reinterpret_cast<>() 进行强行类型 解释 
  20.  
  21.  system("pause");
  22.  return ;
  23. }

dynamic_cast 用法和 reinterpret_cast 用法


  
  1. class Animal 
  2. {
  3. public:
  4.  virtual void  cry() 0
  5. };
  6. class Dog : public Animal 
  7. {
  8. public:
  9.  virtual void  cry()
  10.  {
  11.   cout << "wangwang " << endl;
  12.  }
  13.  void doSwim()  
  14.  { 
  15.   cout << "我要狗爬" << endl
  16.  }
  17. };
  18. class Cat : public Animal
  19. {
  20. public:
  21.  virtual void  cry()
  22.  {
  23.   cout << "miaomiao " << endl;
  24.  }
  25.  void doTree()  
  26.  { 
  27.   cout << "我要爬树" << endl
  28.  }
  29. };
  30. class Book
  31. {
  32. public:
  33.  void printP()
  34.  {
  35.   cout << price << endl;
  36.  }
  37. private:
  38.  int price;
  39. };
  40. void ObjPlay(Animal *base)
  41. {
  42.  base->cry();
  43.  Dog *pDog = dynamic_cast<Dog *>(base);
  44.  if (pDog != NULL)
  45.  {
  46.   pDog->cry();
  47.   pDog->doSwim();
  48.  }
  49.  Cat *pCat = dynamic_cast<Cat *>(base);
  50.  if (pCat != NULL)
  51.  {
  52.   pCat->cry();
  53.   pCat->doTree();
  54.  }
  55. }
  56. void main02()
  57. {
  58.  Animal *base = NULL;
  59.  //1 可以把子类指针赋给 父类指针 但是反过来是不可以的 需要 如下转换
  60.  //pdog = base;  
  61.  Dog *pDog = static_cast<Dog *> (base);
  62.  //2 把base转换成其他 非动物相关的 err
  63.  //Book *book= static_cast<Book *> (base);
  64.  //3  reinterpret_cast //可以强制类型转换
  65.  Book *book2= reinterpret_cast<Book *> (base);
  66.  //4 dynamic_cast用法
  67.  ObjPlay(new Cat());
  68.  system("pause");
  69. }

const_cast用法


  
  1. //典型用法 把形参的只读属性去掉
  2. void Opbuf(const char *p)
  3. {
  4.  cout << p << endl;
  5.  char *p2 = const_cast<char*>(p);
  6.  p2[0] = 'b';
  7.  cout << p << endl;
  8. }
  9. void main()
  10. {
  11.  const char *p1 = "11111111111";
  12.  char *p2 = "22222222";
  13.  char *p3 = const_cast<char *>(p1);
  14.  char buf[100] = "aaaaaaaaaaaa";
  15.  Opbuf(buf);
  16.  //要保证指针所执行的内存空间能修改才行 若不能修改 还是会引起程序异常
  17.  //Opbuf("dddddddddddsssssssssssssss");
  18.  system("pause");
  19. }

程序员要清除的知道: 要转的变量,类型转换前是什么类型,类型转换后是什么类型。转换后有什么后果。

一般情况下,不建议进行类型转换;避免进行类型转换。

文章来源: blog.csdn.net,作者:C语言与CPP编程,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/119955231

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。