首页 > 编程语言 >我刚才用了dynamic_cast 你给我普及一下C++ 中这几种类型转换吧

我刚才用了dynamic_cast 你给我普及一下C++ 中这几种类型转换吧

时间:2023-04-29 14:33:32浏览次数:38  
标签:类型转换 const int dynamic C++ cast 转换

我刚才用了dynamic_cast 你给我普及一下C++ 中这几种类型转换吧

在C++中,有几种类型转换的方式,包括:

  1. 隐式转换

在一些情况下,编译器会自动进行类型转换。比如将整型变量赋值给浮点型变量,编译器就会自动将整型变量转换为浮点型变量。但是在大多数情况下,使用隐式转换可能会引起一些问题,所以在代码中最好不要过多依赖隐式转换。

  1. static_cast

static_cast 是最常用的类型转换方式,可以将一种数据类型转换为另一种数据类型。例如,可以使用 static_cast<int>(3.14) 将浮点型变量转换为整型变量。

  1. const_cast

const_cast 可以将常量指针或常量引用转换为非常量指针或非常量引用。这种转换方式一般用于解除函数的常量限制,使其可以修改数据。需要注意的是,使用 const_cast 进行类型转换是一种危险的行为,需要谨慎使用。

  1. reinterpret_cast

reinterpret_cast 可以将一个指针转换为另一种类型的指针,这种转换方式比较危险,可能会引起不可预测的结果,需要谨慎使用。

  1. dynamic_cast

dynamic_cast 通常用于将一个基类指针或引用转换为派生类指针或引用。需要注意的是,只有在基类指针或引用指向的对象是派生类对象时,才能使用 dynamic_cast 进行类型转换。如果基类指针或引用指向的是其他类型的对象,就会返回空指针或引发 std::bad_cast 异常。

以上是C++中常用的类型转换方式,需要根据实际情况选择不同的方式进行类型转换。

你能不能每隔都举一些正确的例子 和错误的例子

当然可以。以下是常见的 C++ 类型转换以及它们的正确和错误用法的示例:

  1. 静态转换(static_cast)

正确用法:

int a = 10;
double b = static_cast<double>(a);

错误用法:

double c = 3.14;
int* p = &c;
int* q = static_cast<int*>(p); // 错误,p 指向的类型是 double,不是 int
  1. 动态转换(dynamic_cast)

正确用法:

class A {
    virtual void f() {};
};
class B : public A {};
A* pa = new B;
B* pb = dynamic_cast<B*>(pa); // 正确,pa 指向的类型是 B

错误用法:

class A {};
class B : public A {};
A* pa = new A;
B* pb = dynamic_cast<B*>(pa); // 错误,pa 指向的类型是 A
  1. 常量转换(const_cast)

正确用法:

const int a = 10;
int& b = const_cast<int&>(a); // 正确,去除 const 限定符

错误用法:

const int a = 10;
int* p = const_cast<int*>(a); // 错误,不能将常量转换为非常量指针
  1. 重新解释转换(reinterpret_cast)

正确用法:

int a = 10;
void* p = reinterpret_cast<void*>(&a); // 正确,重新解释指针类型

错误用法:

int a = 10;
double b = reinterpret_cast<double>(a); // 错误,将 int 转换为 double 不是重新解释类型

需要注意的是,类型转换有时是有害的,会导致程序出现未定义的行为。在使用类型转换时,应该仔细考虑是否必要以及何时使用。

标签:类型转换,const,int,dynamic,C++,cast,转换
From: https://www.cnblogs.com/simp/p/17363954.html

相关文章

  • 4-28打卡c++ string容器
    1#include<iostream>2#include<string>3usingnamespacestd;4//assign5voidtest01()6{7stringstr1;8//截取三个字符9str1.assign("hello,world",3);10//从第三个字符开始截取4个字符11str1.assign("hello,worl......
  • C++ 中 string自带的find()详解
    首先find()函数存在于string对象中,对于任何一个string类对象都自带find函数,这意味着我们可以对find函数进行重载。find()一共可传七个参数,但是常用的的只有四种情况:对于C++98来说:string(1)传入两个参数,一个是对另一string对象的常引用,一是开始查找的位......
  • c++中的构造函数
    C++中的构造函数可以分为一下几种:默认构造函数初始化构造函数(有参数)拷贝构造函数移动构造函数(move和右值引用)委托构造函数转换构造函数#include<iostream>usingnamespacestd;classStudent{public:Student(){//默认构造函数,没有参数this->age=20......
  • C++中函数重载和重写的区别是什么?
    函数重载:利用命名矫正(namemangling)技术,在编译时把函数名加上参数的首字母来区分同名函数。需要满足3个条件:1.同一个作用域下2.函数名相同3.函数参数类型不同,参数个数不同,参数顺序不同 示例:1......
  • c++中如何强制访问类的保护(protected)/私有(private)性质的成员函数和成员变量
    在使用第三方代码库时,有时候需要访问某个类的函数或者变量,但该对象是保护或者私有的,导致无法正常访问。其实,通过一个简单的友元friend类或函数,可以轻松突破编译器的限制。下面是代码实例。假设第三方库有person类,定义如下。classPerson{private:intage=18;}那么如果强......
  • 类型转换: list string
     /*一:str->list二:list->str1list元素全为str2list元素不全为str*/  一:str->listif__name__=='__main__':str1="12345"print(list(str1))#['1','2','3','......
  • C++中关于默认构造函数(Default Constructor)
    读<<深度探索C++对象模型>>,第二章介绍了默认构造函数,自觉知识点虽基础但是很是被忽略,故作此文记录.关于基础概念不做介绍,先看代码#include<stdio.h>#include<string>classSample{public:intintVal;};classFoo{public:Foo(inta=1000):int......
  • 二分查找算法讲解及其C++代码实现
    二分查找算法是一种常用的查找算法,也被称为折半查找。它可以在有序的数组或列表中快速查找需要的元素。算法描述:首先确定数组的中间位置mid=(left+right)/2;然后将要查找的值key与中间位置的值进行比较;如果key等于中间位置的值,则查找成功,返回mid;如果key小于中间位置的值,则在......
  • C++拟合多项式
     #include<iostream>#include<vector>#include<cmath>#include<ctime>//eigen核心部分#include<Eigen/Core>//稠密矩阵的代数运算(逆、特征值等)#include<Eigen/Dense>usingnamespaceEigen;usingnamespacestd;///<summary>///拟......
  • Vulkan Support Check and Dynamic Loader C++ code sample
    很多时候不想静态依赖VulkanSDK所提供的静态库,因为会遇到一些过早的电脑不支持vulkan,那么就需要使用动态加载vulkan-1.dll(forWindows)或libMoltenVK.dylib(forMacOS)的方式进行判断了。VulkanSDK提供了相关头文件实现可以做到相关功能,仅需要include一下头文件`vulkan/vulkan.hpp......