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

C++ 中几种类型转换

时间:2024-08-22 16:20:03浏览次数:10  
标签:类型转换 转换 int C++ 几种 cast 基类 const 指针

C++中常用的类型除了隐式转换,还有显示转换,如:static_cast, dynamic_cast, const_cast, reinterpret_cast
其中隐式转换如常见的double、int、bool、float 等类型之间的转换。显示转换的用法具体如下:

一、static_cast静态转换

  1. 使用条件:
    (1) 用于不同类型之间的转换,相当于隐式转换
    (2) 默认类型指针与空指针void*之间的转换,如int*, double*void*指针之间,但是不能用于 int*double*等之间的转换
    (3) 类指针或引用之间的转换,用于基类与派生类之间

  2. 使用案例

// 1、相当于隐式转换
double val = 126.33;
int res = static_cast<int>(val);

// 2、默认数据类型指针之间的转换
void* p1 = new int(10);
int* p2 = static_cast<int*>(p1); // 将void*指针和int* 指针之间进行转换

double* p3 = new double(88.66);
int* p4 = static_cast<int*>(p3); // 错误:无法在 int* 与 double* 类型之间进行转换,只能在默认类型指针与void*指针之间进行转换

// 3、不同类之间的转换(Base为基类,Derived为派生类),指针类型和引用类型都可以
Base* bs01 = new Base();
Derived* dr01 = new Derived();

// 将基类转换成派生类:向下转换
Derived* dr02 = static_cast<Derived*>(bs01);
// 将派生类转换成基类:向上转换
Base* bs02 = static_cast<Base*>(dr01);

二、dynamic_cast动态转换

  1. 使用场景:
    (1) 动态转换只能用于: 类类型的指针或引用之间的转换,或与 void 指针之间的转换

  2. 使用案例:

/****************************************
* @brief  Base 为基类, Derived为派生类
****************************************/

Base* bs01 = new Base();
Derived* dr01 = new Derived();

// 将派生类指针转换成基类指针:向上转换是安全的
Base* bs02 = dynamic_cast<Base*>(dr01);

// 将基类转换成派生类:向下转换,将会得到 dr02 = nullptr
Derived* dr02 = dynamic_cast<Derived*>(bs01);

Base* bs01 = new Base();
Derived* dr01 = new Derived();

// 将派生类指针转换成基类指针:向上转换是安全的,bs02不为 NULL
Base* bs02 = dynamic_cast<Base*>(dr01);

// 将基类转换成派生类:向下转换,将会得到 dr02 = NULL
Derived* dr02 = dynamic_cast<Derived*>(bs01);

// 将其转换为 void* 指针,此时ptr不为NULL
void* ptr = dynamic_cast<void*>(bs01);
  1. 注意事项:
    (1) 使用 dynamic_cast 进行转换时、基类必须要有虚函数,否则进行向下转换(基类 --> 派生类)将会报错。
    (2) dynamic_cast 动态转换是在运行时进行检查转换是否成功,如果转换失败,则对应的指针将为 NULL
    (3) dynamic_cast 进行向下转换将会失败,结果为 NULL
    (4) dynamic_cast 进行向上转换(派生类 --> 基类)是安全的,其效果与 static_cast 相同

三、const_cast

主要用于删除 const、volatile属性,用于 const 指针或引用非const 指针或引用之间的转换
使用案例如下:

int val = 100;
const int* ptr = &val;
const int& num = val;

// 将常量指针或引用转化非常量指针或引用
int* res1 = const_cast<int*>(ptr);
int& res2 = const_cast<int&>(num);

*res1 = 666; // val的值将被修改为 666
res2 = 888;  // val的值将被修改为 888

注意事项:


四、reinterpret_cast

reinterpret_cast 可以将任何指针转换为任何其他指针类型,也允许将整数类型转换为任何指针类型以及反向转换。一般是从底层对数据进行重新解释,不同的编译器有不同的实现,其移植性相对较差,使用需要相对谨慎。

使用案例:

// 将bool类型的指针转换成double类型的指针
bool bg = false;
double* p1 = reinterpret_cast<double*>(&bg);

// 将int类型转换成任何类型的指针(在此为double*)
int val = 66;
double* p2 = reinterpret_cast<double*>(val);

标签:类型转换,转换,int,C++,几种,cast,基类,const,指针
From: https://www.cnblogs.com/Jeffxu/p/18374108

相关文章

  • C++版的Minecraft
    非常垃圾的c++版Mc.#include<bits/stdc++.h>#include<windows.h>#include<conio.h>usingnamespacestd;typedefstructFrame{COORDposition[2];}Frame;voidColor(inta){//白if(a==0)SetConsoleTextAttribute(GetStdHandle(STD_O......
  • 【C++】定义类型别名的三种方式及其优缺点:typedef,#define 和 using
    引言类型别名是一种给已存在的类型创建一个新名字的方式。这个新的名字(别名)和原类型在语义上是完全相等的,可以在任何原类型可以使用的地方使用。类型别名并不创建一个新的类型,只是为了提高代码的可读性和可维护性。在C++中,可以使用typedef,#define或者using来定义别名。每......
  • C++(typename)
    目录1.指定依赖于模板参数的类型2.定义嵌套依赖类型3.关键点:4.示例:5.需要注意的地方:总结:在C++中,typename是一个关键字,通常用于模板编程。它主要用于以下两种场景:1.指定依赖于模板参数的类型当你在模板中使用依赖于模板参数的类型时,C++编译器有时无法确定你是否指的是......
  • 【C++】类和对象(上)
    前言:上一章讲到C++入门的基础知识,是为了增加对C++的了解,为了更好的学习接下来的内容,本章讲到类和对象(上)。类是一种抽象的数据类型,它定义了一组具有相同属性和行为的对象的模板。[!NOTE]问题:C语言和C++语言的主要区别?C语言是面向过程的语言,C++是面向对象的语言。C语......
  • Java当中有几种方式来创建线程执行任务?
    1.继承thread类publicclassyxextendsThreads{publicstaticvoidmain(String[]args)[yxthread=newyx();thread.start();}@Overridepublicvoidrun(){system.out.println("helloyx&qu......
  • C# 类型转换
    类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在C#中,类型转换有两种形式:隐式类型转换-这些转换是C#默认的以安全方式进行的转换。例如,从小的整数类型(int)转换为大的整数类型(long),从派生类转换为基类。显式类型转换-这些转换是通过用户使......
  • 关于C++函数返回值的拷贝优化问题
    在传统C++程序中,如果函数的返回值是一个对象的话,可能需要对函数中的局部对象进行拷贝。如果该对象很大的话,则程序的效率会降低。在C++11以后,出现的移动语义(MoveSemantic)及拷贝优化(CopyElision)都是解决这个问题的方法。本文试图以一个最简单的例子来说明这个问题。案例下面来看......
  • C++学习,运算符
    运算符是告诉编译器执行特定数学或逻辑函数的符号。C++语言内置运算符丰富,提供以下类型的运算符:算术运算符关系运算符逻辑运算符按位运算符赋值运算符其它运算符 算术运算符(ArithmeticOperators)下表显示了C++语言支持的所有算术运算符。假设变量A=10,变量B=20:操作......
  • C++学习,数据类型
    编写程序时,需要使用各种变量来存储信息,变量是用于存储值的内存。创建变量时,在内存中保留了一些空间。存储各种数据类型的信息,如字符,宽字符,整数,浮点,双浮点,布尔等。根据变量的数据类型,系统分配内存并决定可以存储的内容。 内置类型C++提供了丰富的内置和用户定义的数据类......
  • C++ queue(STL queue,队列)用法详解
    只能访问queue<T>容器适配器的第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素。许多程序都使用了queue容器。queue容器可以用来表示超市的结账队列或服务器上等待执行的数据库事务队列。对于任何需要用FIFO准则处理的序列来说,使用queue容器适......