首页 > 其他分享 >const_cast用法

const_cast用法

时间:2023-06-14 22:35:22浏览次数:62  
标签:const 指向 int 用法 cast ptr 指针

顶层const&底层const:

普通变量没有底层顶层的区别;

int const a == const int a

只有对应指针,引用才会有区别:指针常量->顶层const,指针本身不可被修改。

int * const b = &a,a既可以通过a = x来改变,也可以通过*b = x来改变,但不可以把b指向别的地址、别的变量。例如声明

int c = 2;b=c即会报错。

指向常量的指针->底层const,指针本身可修改,但指向的值可修改。

const int* b = &a,a可以通过a = x来改变,但不可以通过*b = x来更改。

可以将b指向别的地址,变量。例如声明int c =2;b = c。

形式上区别二者通过看 * 和const的相对位置,int * const ptr,ptr首先是一个常xx,随后前面的int*修饰了,ptr是一个常指针,并且是一个指向int类型的常指针,常指针即指针常量,即顶层const(本身不可被修改,大概是因为指针比所修饰的对象高一层,所以叫顶层const)。

int const* ptr,首先ptr前面是一个*,则得知ptr是一个指针,前面的int const得知,是一个指向int类型常量的指针,即指向常量的指针,即底层const(指向的对象是常量)。

const_cast:

用来去除变量、表达式的底层const属性。

但要明确const_cast只是C++的一种妥协,当存在某个指向常量的指针(底层cosnt,不允许通过该指针改变其指向的内容),我们需要改变其指向的内容,但缺无法直接获取该变量,这时候使用const_cast可以去掉上述指针的const属性,并将其中地址赋予新指针,这个新指针就可以去更改内容。

如int a = 1;

const int * ptr = a;

int *ptr2 = const_cast<int *>(ptr);//假设a在此处很难获取,即重新定义一个int*指针,来接受ptr中除了const属性之外的东西。

*ptr2 = 2;

这时输出a,即等于2。

这时候如果a是 const int a = 1;那么上述代码就会出错,因为尝试修改常量。

其实也可以用来改变顶层,不过是没有意义的行为:

int b = 1, c = 22;

int* const d = &b;//top const

int* p2 = const_cast<int *>(d);
p2 = &c;

cout << "d: " << *d<<" p2: "<<*p2;

实际上d所指向的内容是不会变的,你只是重新定义了一个int*指针,并用d保存的地址来初始化它,除此之外没有意义。
————————————————
原文链接:https://blog.csdn.net/JosephXQ/article/details/80734567

 

标签:const,指向,int,用法,cast,ptr,指针
From: https://www.cnblogs.com/im18620660608/p/17481529.html

相关文章

  • C++类型转换详解--const_cast
    一.函数描述:const_cast<type-id>(expression)主要是用来去掉const属性,当然也可以加上const属性。主要是用前者,后者很少用。去掉const属性:const_case<int*>(&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。加上const属性:constint*k=const_case......
  • C++ 深入理解const_cast转换运算符
    const_cast转换运算符我们在RTTI和类型转换运算符中详细介绍过它的用法和使用场景,今天我们对其进一步了解一下。首先我们回忆一下它的作用和用法。const_cast的基本使用const_cast运算符用于执行只有一种用途的类型转化,即改变const或volatile。用法如下:const_cast<type_name>......
  • 正确使用C++的const_cast
    C++的四种类型转换之const_cast前言引用《EffectiveC++中文版第三版》中条款27"尽量少做转型动作"中的一段话:C++规则的设计目标之一是,保证“类型错误”绝对不可能发生,理论上如果你的程序很“干净”的通过编译,就表示它并不企图在任何对象上执行任何不安全、无意义、愚蠢......
  • C++ const_cast用法
    原文C++const_cast用法const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。用法:const_cast<type>(expression)通过const_cast运算符,也只......
  • 最快最好用的数据增强库「albumentations」 一文看懂用法
    本文内容如下1.Albumentations的自我介绍2.案例欣赏3.如何安装4.有哪些数据增强方法4.1像素级变换(Pixel-leveltransforms)4.2空间级变换(Spatial-leveltransforms)5.看完就会的使用方法5.1Compose5.2Oneof5.3我们再随便看看其他的一些方法。5.4怎么把这些增强方法和pytorch......
  • MONAI(4)—一文看懂各种Transform用法(下)
    6裁剪&填充【SpatialCropd,CenterSpatialCropd,CropForegroundd,RandCropByPosNegLabeld,SpatialPadd】对于CT或者MRI图像来讲,图像是非常大的,又是一个三维图像,不可能全部输入网络中训练。要么把图像直接Resize到固定的尺寸,要么就是裁剪图像。monai提供了非常多的裁剪模式,包括......
  • MONAI(3)—一文看懂各种Transform用法(上)
    在上一次分享中,我们在Dataset方法里,已经使用了transform函数,这节课对transform做一个详细的介绍。上一次视频连接:MONAI中,一定要学会的三种Datasettransform大致可以分为以下几个类别想要什么样类别的变换,就在该类别下去找。目录普通变换和字典变换的联系与区别1.数据准备2.加载NIf......
  • Runtime.getRuntime().exec("ipconfig") 的用法
    ​ `Runtime.getRuntime().exec()`是Java中的一个方法,可以在Java程序中执行外部程序。这个方法返回一个`Process`对象,可以用于控制和查看执行的外部程序。`exec()`方法有多个重载版本,可以传递不同的参数来控制执行的外部程序。例如:importjava.io.BufferedReader;import......
  • Runtime.getRuntime().exec("ipconfig") 的用法
    ​ `Runtime.getRuntime().exec()`是Java中的一个方法,可以在Java程序中执行外部程序。这个方法返回一个`Process`对象,可以用于控制和查看执行的外部程序。`exec()`方法有多个重载版本,可以传递不同的参数来控制执行的外部程序。例如:importjava.io.BufferedReader;import......
  • vue watch deep 用法
    简单案例<template><div><h1>watchdeep</h1><p>obj:{{obj}}</p><p>调用watch次数:{{times}}</p><button@click="chgObj">改变对象</button></div></t......