首页 > 编程语言 >c++ cast

c++ cast

时间:2024-01-30 13:35:06浏览次数:29  
标签:const int void c++ cast static 指针

static_cast

static_cast(expression)

用于非多态类型的低风险转换,如基类和派生类之间的转换,基本数据类型之间的转换(包括任何隐式转换),用户自定义转换,把void指针转换成目标类型的指针等。不进行运行时类型检查,只在编译时检查。

具体如下

  • 用于类层次结构中基类和派生类之间指针或引用的转换。这种转换与dynamic_cast的区别是,static_cast不会进行运行时类型检查,所以如果转换是不安全的,那么编译器也不会给出任何警告或者错误。
class B {};
class D : public B {};
void f(B* pb, D* pd) {
   D* pd1 = static_cast<D*>(pb);   // Not safe
   B* pb1 = static_cast<B*>(pd);   // Safe
}
  • 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换与C语言中的强制类型转换类似。
void f() {
    char ch;
    int i = 65;
    float f = 2.5;
    double dbl;
    enum bits {one = 1, two = 2, four = 4};
    bits bit;

    ch = static_cast<char>(i);   // int to char
    dbl = static_cast<double>(f);   // float to double
    i = static_cast<BYTE>(ch);
    i = static_cast<int>(two);   // enum to int
    bit = static_cast<bits>(i);   // int to enum
}
  • 用于把空指针转换成目标类型的指针。
    不同类型指针之间,指针和其他基本数据类型之间都不能进行static_cast转换
void f()
{
    void *p = malloc(4);
    int *q = static_cast<int*>(p);
    char* qq = static_cast<char*>(q); // wrong
    int qp = static_cast<int>(q); // wrong
}

reinterpret_cast

允许将任何指针转换为任何其他指针类型。 也允许将任何整数类型转换为任何指针类型以及反向转换。

unsigned short Hash( void *p ) {
   unsigned int val = reinterpret_cast<unsigned int>( p );
   return ( unsigned short )( val ^ (val >> 16));
}
int main() {
   int a[20];
   for ( int i = 0; i < 20; i++ )
      cout << Hash( a + i ) << endl;
}

const_cast

从某个类删除 const、volatile 和 __unaligned 属性。
底层const:指针指向的值是const;顶层const:指针本身是const
从以下例子可以看出,利用const_static试图对底层const进行修改得到了未定义行为,实际上并没有修改其值;而对象本身不是const,对应指针有底层const,这样可以通过const_cast修改其值。

class CCTest {
public:
   void setNumber( int );
   void printNumber() const;
private:
   int number;
};
void CCTest::setNumber( int num ) { number = num; }
void CCTest::printNumber() const {
    cout << "Before: " << number << endl;
    const_cast< CCTest * >( this )->number--;
    cout << "After: " << number << endl;
}
int main() {
    CCTest X;
    X.setNumber( 8 );
    X.printNumber();
    X.printNumber();
    
    const int p = 10; 
    int *q = const_cast<int*>(&p);
    *q = 20;
    cout << &p <<" " << q << " " << p << endl;

    const int *pp = new int(10);
    int *qq = const_cast<int*>(pp);
    *qq = 20;
    cout << *pp << endl;
}

标签:const,int,void,c++,cast,static,指针
From: https://www.cnblogs.com/wangerblog/p/17996905

相关文章

  • Visual Studio部署C++矩阵库Armadillo的方法
      本文介绍在VisualStudio软件中配置C++环境下线性代数运算库Armadillo的方法。  首先,我们需要在Armadillo库官网下载其源代码,直接点击下图所示红色框内部分即可。  点击上图所示位置后,将弹出一个新的下载界面;Armadillo库的源代码将随后自动下载。  接下来,我们在Vis......
  • C++多态
    多态的概念多态(Polymorphism)是面向对象编程中的一个重要概念,它允许同一类型的对象在不同的上下文中表现出不同的行为。多态性有两种主要形式:编译时多态(静态多态性)和运行时多态(动态多态性)。编译时多态可以看成是函数重载和运算符重载,之前的文章已经涉及过,不再赘述;所以,下面所提到的多......
  • C++实现直接插入排序、冒泡排序、快速排序、选择排序(含调试程序)
    #include<iostream>#include<fstream>#include<string>#include<vector>#include<algorithm>usingnamespace::std;classSolution{public: //直接插入排序 voidinsertsort(vector<int>&num){ for(inti=1;i<num......
  • C++ Qt开发:运用QJSON模块解析数据
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QJson组件的实现对JSON文本的灵活解析功能。JSON(JavaScriptObjectNotation)是一种轻量级......
  • 有关UE5在VisualStudio升级后产生C++无法编译的问题及处理方案
    哈喽大家好,我是咕噜美乐蒂,很高兴又见面啦!最近,许多使用UE5的游戏开发者遇到了一个问题:在VisualStudio升级后,他们的C++代码无法编译。这个问题可能是由于UE5工程和VS之间的版本不兼容导致的。本文将深入探讨这个问题的原因以及如何解决它。一、问题的产生原因UE5是一款基于C++的游戏......
  • QT Creator12.0.1运行普通C/C++程序时候没有控制台输出
    问题:QTCreator12.0.1运行普通C/C++程序时候没有控制台输出菜单栏选择:[编辑]->[设置],按下图依次设置。启用终端输出,还有去掉内部终端输出的选项运行后控制台窗口正常弹出......
  • Qt/C++音视频开发64-共享解码线程/重复利用解码/极低CPU占用/画面同步/进度同步
    一、前言共享解码线程主要是为了降低CPU占用,重复利用解码,毕竟在一个监控系统中,很可能打开了同一个地址,需要在多个不同的窗口中播放,形成多屏渲染的效果,做到真正的完全的画面同步,在主解码线程中切换了播放进度,所有关联的同一个解码线程的播放窗体也会立即同步画面,使得感官上看起来......
  • C++类模板
    1.类模板作用:建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表语法:template<typenameT>类解释:template-声明创造模板typename-表面其后面的符号是一种数据类型,可以用class代替T-通用的数据类型,名称可以替换,通常为大写字母二.类模板和函数模......
  • C/C++中的宏
    目录"##"预处理运算符"##"预处理运算符在C++中,##是一个预处理运算符,被称为“连接符”或“连接运算符”。当它在宏定义中出现时,它将其左右两边的标记(token)连接成一个标记。这在创建宏时特别有用,尤其是当你需要合并两个标记来形成一个新的、有效的标记时。以下是一些使用##的......
  • C++多线程 第一章 你好,C++并发世界
    第一章你好,C++并发世界C++并发并发(concurrency):主要包括任务切换与硬件并发两类.并发(concurrency)实际上与多线程(multithreading)存在差异.并发的种类任务切换(taskswitching):计算机在某一时刻只可以真正执行一个任务,但它可以每秒切换任务许多次.通过做一......