首页 > 编程语言 >C++四种类型转换

C++四种类型转换

时间:2023-06-20 09:13:16浏览次数:55  
标签:类型转换 子类 C++ cast 父类 四种 指针

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

const_cast

主要用于删除变量的const属性,便于赋值

const int a = 2;

int* p = const_cast<int*>(&a );

*p = 3;

reinterpret_cast

仅仅是重新解释类型,没有二进制的转化,主要用于:

  1. 指针,整数之间的互相转化
  2. 在指针类型(尤其是函数指针)之间进行转换

int *ip;

char *pc = reinterpret_cast<char*>(ip);

依赖于硬件,移植性很差,很少使用。

static_cast

  1. 主要用于基本类型的转换,如int转double等
  2. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)
  3. 把空指针转换成目标类型的空指针

PS:

相比于C语言的直接转换,static_cast具有编译时期的类型检查机制,同时可读性好,便于查错。

B,C类型无关

C* pc = (C*) new B;//可以编译通过

C* pc = static_cast<C*>(new B); //编译错误!!!

dynamic_cast

有条件转换,动态类型转换,运行时类型安全检查(转换失败返回NULL):

  1. 安全的基类和子类之间转换.
    向上转型:子类对象指针->父类指针/引用(不需要转换) 
  2. 向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的)
  3. dynamic_cast只能用于含有虚函数的类
  4. 相同基类不同子类之间的交叉转换,但结果是NULL。dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回NULL

为何使用dynamic_cast转换类指针时,需要虚函数呢。

Dynamic_cast转换是在运行时进行转换,运行时转换就需要知道类对象的信息(继承关系等)。 

如何在运行时获取到这个信息——虚函数表。 

C++对象模型中,对象实例最前面的就是虚函数表指针, 

通过这个指针可以获取到该类对象的所有虚函数,包括父类的。 

因为派生类会继承基类的虚函数表,所以通过这个虚函数表,我们就可以知道该类对象的父类,在转换的时候就可以用来判断对象有无继承关系。 

所以虚函数对于正确的基类指针转换为子类指针是非常重要的。

  DerivedClass *pd1 = static_cast<DerivedClass *>(pb);

 

  //子类->父类,静态类型转换,正确但不推荐

 

  DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb);

 

  //子类->父类,动态类型转换,正确

 

  BaseClass* pb2 = new BaseClass();

 

  DerivedClass *pd21 = static_cast<DerivedClass *>(pb2);

 

  //父类->子类,静态类型转换,危险!访问子类m_szName成员越界

 

  DerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2);

 

  //父类->子类,动态类型转换,安全的。结果是NULL

以上是关于C++四种类型转换的主要内容,如果未能解决你的问题,请参考以下文章

C++ 的四种类型转换

C++中四种转换类型的区别

C++: 四种强制类型转换

你该知道的C++四种显式类型转换

C++四种类型转换

C++四种类型转换

 

https://it.cha138.com/android/show-59936.html

 

标签:类型转换,子类,C++,cast,父类,四种,指针
From: https://www.cnblogs.com/im18620660608/p/17492725.html

相关文章

  • C++ 关键字四种cast类型转换
    1.23四种cast类型转换作用:克服c中强制类型转化带来的风险,C++引入四种更加安全的强制类型转换运算符(明确转换的目的,偏于程序的维护和分析)const_cast://1.去除const属性,将只读变为只读写//2.针对常量指针、常量引用和常量对象constchar*p;char*p1=const_cast<char*>(p......
  • C++ 数据类型转换详解之终极无惑
    程序开发环境:VS2017+Win32+Debug文章目录1.隐式数据类型转换2.显示数据类型转换3.C++新式类型转换3.1const_cast3.2static_cast3.3dynamic_cast3.3.1向下转换3.3.2交叉转换3.4reinterpret_cast4.重载相关类型转换操作符4.1不同类对象的相互转换4.2基本数据类型与类对象......
  • C++面试八股文:什么是智能指针?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第19面:面试官:什么是智能指针?二师兄:智能指针是C++11引入的类模板,用于管理资源,行为类似于指针,但不需要手动申请、释放资源,所以称为智能指针。面试官:C++11引入了哪些智能指针?二师兄:三种,分别是shared_ptr、unique_ptr、和weak_ptr。......
  • C++面试八股文:什么是智能指针?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第19面:面试官:什么是智能指针?二师兄:智能指针是C++11引入的类模板,用于管理资源,行为类似于指针,但不需要手动申请、释放资源,所以称为智能指针。面试官:C++11引入了哪些智能指针?二师兄:三种,分别是shared_ptr、unique_ptr、和weak_ptr。......
  • C++继承和派生
    #继承和派生在C++中,继承和派生是面向对象编程的两个重要概念,用于实现类与类之间的关系。继承是指一个类可以从另一个类中继承属性和方法,并且可以在此基础上扩展出自己的属性和方法。被继承的类称为基类(父类),继承的类称为派生类(子类)。在C++中,可以通过以下方式定义一个派生类:```c++cl......
  • c++ 2.0 总结
    class内存分配与释放#include<iostream>#include<memory>usingnamespacestd;classPerson{public:Person(){cout<<"personconstructor"<<endl;}~Person(){cout<<"person......
  • C++:STL库
    模板编程泛型编程STL常用组件lambda表达式异常处理内存处理部分数据结构部分算法STL由算法,容器,迭代器,适配器,仿函数(函数对象),空间适配器六大部件组成。我们将主要讲解容器,迭代器,算法和仿函数。适配器的部分会交给学员来实现,而空间适配器不会太过于深入。从上往下学习STL,学习曲......
  • C++11:多线程
    传统的C++(C++11之前)中并没有引入线程这个概念C++11引入了头文件<thread>,提供了管理线程保护共享数据线程间同步操作原子操作等  <thread>join()detach()get_id()yield()sleep_for()sleep_until() #include<thread>intmain(){ std::threadt......
  • C++ typeid关键字详解
    typeid关键字 注意:typeid是操作符,不是函数。这点与sizeof类似)运行时获知变量类型名称,可以使用typeid(变量).name()需要注意不是所有编译器都输出”int”、”float”等之类的名称,对于这类的编译器可以这样使用intia=3;if(typeid(ia)==typeid(int)){  cout<<"in......
  • C++11:Lambda表达式
    Lambda表达式为了一些简单的函数直接调用封装[var]:表示值传递方式捕捉变量var[=]:表示值传递捕捉所有父作用域中的变量(包括成员函数中的this)[&var]:表示引用传递捕捉变量var[&]:表示引用传递捕捉所有父作用域中的变量(包括成员函数中的this)[this]:表示值传递方式捕捉当前的this指......