首页 > 编程语言 >C++ 关键字四种cast类型转换

C++ 关键字四种cast类型转换

时间:2023-06-20 09:13:06浏览次数:36  
标签:类型转换 转换 C++ cast static 基类 类型 指针

1.23 四种cast类型转换

作用:克服c中强制类型转化带来的风险,C++引入四种更加安全的强制类型转换运算符(明确转换的目 的,偏于程序的维护和分析)

const_cast:

// 1.去除const属性,将只读变为只读写

// 2.针对常量指针、常量引用和常量对象

const char *p;

char *p1 = const_cast<char*>(p);

 

2. static_cast

// 1.内置数据类型之间的转换,int转double,char转int

// 2.基类指针与派生类之间的转换,只能转换有继承或派生关系的类。用于类层次结构之间基类和派生类指针和引用之间的转换,进行向上转型是安全的,但是进行向下转型是不安全的,但是是可以转换的;向上转型:我们知道基类的引用和指针都可以指向派生类的对象,那么将派生类的指针或者引用强转为基类的指针或者引用,那么这就是向上转型,也就是向父类转;向下转型:向下转型就和向上转型相反,它是将父类的指针或者引用,强制转换为子类的指针或者引用

// 3.把void类型指针转换为目标类型的指针

// 4.任何类型的表达式转化为void类型

// 整形转浮点型

int a = 10;

double b = static_cast<double>a;

 

//基类指针转派生类

class A{}; class B : public A{};

 

A *pA = new A;

 

B *pB = static_cast<B*>(pA);

 

reinterpret_cast

可以将一个类型的指针转换为其它任意类型的指针,也可以用在指针和整形数据之间的转换它是很危险的,如果我们没有使用它的充分理由,那么就不要使用它

为运算对象的位模式提供较低层次上的重新解释

用于底层的强制转换,依赖于机器,一般使用较少

dynamic_cast

dynamic_cast是运行时处理的,运行时进行类型检查,其他三种是编译时处理的

不能用于内置数据类型之间的转换

dynamic_cast在进行上行转换时和static_cast效果是一样的,但是进行下行转换时会进行类型检查,比static_cast更加安全,下行转换是否成功取决于转换对象的实际类型与目标类型是否相同

要求基类必须具有虚函数,否则编译不通过

若转换成功,返回的是指向目标的指针或引用,不成功返回NULL

 

https://www.cnblogs.com/qiujunxian/p/16757291.html

 

标签:类型转换,转换,C++,cast,static,基类,类型,指针
From: https://www.cnblogs.com/im18620660608/p/17492723.html

相关文章

  • 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指......
  • UE5 C++ 定时器使用
    概念定时器在全局定时器管理器(FTimerManager类型)中管理。全局定时器管理器存在于游戏实例对象上以及每个场景中。有两个函数可以使用定时器管理器来设置定时器:SetTimer和SetTimerForNextTick,它们各自都有一些重载,每个函数都可以连接到任意类型的对象或函数委托使用访......