C++基础语法(五):C++类型转换【静态转换(static_cast)、动态转换(dynamic_cast)、常量转换(const_cast)】

男娘i 2023-09-28 07:31 54阅读 0赞

类型转换(cast)是将一种数据类型转换成另一种数据类型。例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型。

转换是非常有用的,但是它也会带来一些问题,比如在转换指针时,我们很可能将其转换成一个比它更大的类型,但这可能会破坏其他的数据。

应该小心类型转换,因为转换也就相当于对编译器说:忘记类型检查,把它看做其他的类型。

一般情况下,尽量少的去使用类型转换,除非用来解决非常特殊的问题。

无论什么原因,任何一个程序如果使用很多类型转换都值得怀疑.

标准c++提供了一个显示的转换的语法,来替代旧的C风格的类型转换。

使用C风格的强制转换可以把想要的任何东西转换成我们需要的类型。那为什么还需要一个新的C++类型的强制转换呢?

新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。

一、静态转换(static_cast)

 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。

  • 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
  • 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

 用于基本数据类型之间的转换,如把int转换成char,把char转换成int。这种转换的安全性也要开发人员来保证。

  1. class Animal{
  2. };
  3. class Dog : public Animal{
  4. };
  5. class Other{
  6. };
  7. //基础数据类型转换
  8. void test01(){
  9. char a = 'a';
  10. double b = static_cast<double>(a);
  11. }
  12. //继承关系指针互相转换
  13. void test02(){
  14. //继承关系指针转换
  15. Animal* animal01 = NULL;
  16. Dog* dog01 = NULL;
  17. //子类指针转成父类指针,安全
  18. Animal* animal02 = static_cast<Animal*>(dog01);
  19. //父类指针转成子类指针,不安全
  20. Dog* dog02 = static_cast<Dog*>(animal01);
  21. }
  22. //继承关系引用相互转换
  23. void test03(){
  24. Animal ani_ref;
  25. Dog dog_ref;
  26. //继承关系指针转换
  27. Animal& animal01 = ani_ref;
  28. Dog& dog01 = dog_ref;
  29. //子类指针转成父类指针,安全
  30. Animal& animal02 = static_cast<Animal&>(dog01);
  31. //父类指针转成子类指针,不安全
  32. Dog& dog02 = static_cast<Dog&>(animal01);
  33. }
  34. //无继承关系指针转换
  35. void test04(){
  36. Animal* animal01 = NULL;
  37. Other* other01 = NULL;
  38. //转换失败
  39. //Animal* animal02 = static_cast<Animal*>(other01);
  40. }

二、动态转换(dynamic_cast)

 ynamic_cast主要用于类层次间的上行转换和下行转换;
 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全;

  1. class Animal {
  2. public:
  3. virtual void ShowName() = 0;
  4. };
  5. class Dog : public Animal{
  6. virtual void ShowName(){
  7. cout << "I am a dog!" << endl;
  8. }
  9. };
  10. class Other {
  11. public:
  12. void PrintSomething(){
  13. cout << "我是其他类!" << endl;
  14. }
  15. };
  16. //普通类型转换
  17. void test01(){
  18. //不支持基础数据类型
  19. int a = 10;
  20. //double a = dynamic_cast<double>(a);
  21. }
  22. //继承关系指针
  23. void test02(){
  24. Animal* animal01 = NULL;
  25. Dog* dog01 = new Dog;
  26. //子类指针转换成父类指针 可以
  27. Animal* animal02 = dynamic_cast<Animal*>(dog01);
  28. animal02->ShowName();
  29. //父类指针转换成子类指针 不可以
  30. //Dog* dog02 = dynamic_cast<Dog*>(animal01);
  31. }
  32. //继承关系引用
  33. void test03(){
  34. Dog dog_ref;
  35. Dog& dog01 = dog_ref;
  36. //子类引用转换成父类引用 可以
  37. Animal& animal02 = dynamic_cast<Animal&>(dog01);
  38. animal02.ShowName();
  39. }
  40. //无继承关系指针转换
  41. void test04(){
  42. Animal* animal01 = NULL;
  43. Other* other = NULL;
  44. //不可以
  45. //Animal* animal02 = dynamic_cast<Animal*>(other);
  46. }

三、常量转换(const_cast)

该运算符用来修改类型的const属性。。

  • 常量指针被转化成非常量指针,并且仍然指向原来的对象;
  • 常量引用被转换成非常量引用,并且仍然指向原来的对象;

注意:不能直接对非指针和非引用的变量使用const_cast操作符去直接移除它的const.

  1. //常量指针转换成非常量指针
  2. void test01(){
  3. const int* p = NULL;
  4. int* np = const_cast<int*>(p);
  5. int* pp = NULL;
  6. const int* npp = const_cast<const int*>(pp);
  7. const int a = 10; //不能对非指针或非引用进行转换
  8. //int b = const_cast<int>(a); }
  9. //常量引用转换成非常量引用
  10. void test02(){
  11. int num = 10;
  12. int & refNum = num;
  13. const int& refNum2 = const_cast<const int&>(refNum);
  14. }

四、重新解释转换(reinterpret_cast)

这是最不安全的一种转换机制,最有可能出问题。

主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针.

发表评论

表情:
评论列表 (有 0 条评论,54人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ 类型转换

    1、类型转换介绍 C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a    C++风格的类型转换提供了4种

    相关 C#——类型转换

    类型转换 > 一、c\类型转换可以分为两大类:一类是同一类型转换(Cast),另一类是不同类型转换(Convert)。    (一)同一类型转换(Cast)可分为两种:

    相关 c++】类型转换

    类型转换很重要,这有助于理解c++的工作细节,可以分为自动类型转换和强制类型转换 自动类型转换 ①将一种算术类型的值赋值给另一种算术类型的变量时,c++对值进行转换

    相关 c++ 类型转换

    自动类型转换很重要,这有助于理解c++的工作细节 自动类型转换 ①将一种算术类型的值赋值给另一种算术类型的变量时,c++对值进行转换 ②表达式中包含不同的类型时,c

    相关 c++ 类型转换

    算术转换 -------------------- 整型提升 负责把小的整数类型转换为较大的整数类型。 bool、char、sign char、unsi

    相关 C++类型转换

    1.引言        C++的强制类型转化用于不同的情况和原因,比C进步的是C++将这些情况细分并用不同的强制类型转换符号来表示。这样程序就比C更容易解析。     

    相关 C++类型转换

    C++类型转换 C语言类型转换 在c语言中,存在两种类型转换,一种是隐式类型转换,另一种是显示类型转换。 如下所示。 int a = 4; dou