关于类型转换的细节(隐式类型转换的临时变量和理解const权限)

文章目录

  • 前言
  • 类型转换的细节
    • 1. 类型转换的临时变量
    • 细节二:const与指针

前言

关于类型转换的细节,这里小编和大家探讨两个方面:

  1. 关于类型转化的临时变量的问题
  2. const关键字的权限问题 — 即修改权限。小编或通过一道例题(配图)来带大家了解这个权限问题!

类型转换的细节

还有一些常见的问题(例如整型提升的问题)小编这里不做介绍,主要介绍下面两种:

1. 类型转换的临时变量

为什么说类型转换细节呢?来看下面的程序:

#include<iostram>
using namespace std;
int main()
{int a = 0;double& ref = a;return 0;
}

又或者是这样:

#include<iostram>
using namespace std;
int main()
{int a = 0;double& ref = (double)a;return 0;
}

上面代码有问题吗?当然有问题,VS2022编译器是会报错的……

在这里插入图片描述

这是什么原因导致的呢?

  • 实际上一个类型转换的过程应该是这样的:
    在这里插入图片描述
    临时变量tmp是具有常性的(可读不可写),所以是无法如此被引用的。所以只能通过另外的方法,得到它们的引用。

注:关于这个观点证明,借助右值引用的移动语义就可以完成验证。

#include<iostram>
using namespace std;
int main()
{int a = 0;const double& ref = a;return 0;
}
  • 一定是const type&才可以。一定要注意这个细节。
  • 关于对于这个问题,编译器在对自定义类型的时候都会做出一定的优化

那么对于这些场景就会产生许多问题,例:

namespace test
{class A{public:A():_a(1){}virtual void set(int val){_a = val;}int _a;};class B :public A{public:B():_b(0){}virtual void set(int val){static_cast<A>(*this).set(val); //很有问题的写法//A::set(val);}int _b;};void Test1(){B bb;bb.set(120);cout << bb._a << endl;}
}

我们想要在B类的set中调用A类(父类)的set,但是这样的类型转换是不会起到任何效果的,还记得刚刚所讨论的吗?类型转换会产生临时变量临时变量是不会改变原来的值的。这些都是隐式类型转换的细节。

包括有时候对指针进行了强制类型转换过后:

int a = 10;
int* ptr = &a;
char* c = ++(char*)ptr;

这样的类型转换都是不会达到如愿的结果的!!!

细节二:const与指针

在说明这个问题之前,我们先声明:

  • 权限可以缩小
  • 权限可以平移
  • 权限不能放大

来看下面这个例子,来理解一些关于权限问题

const int* const ptr1 = 0;
const int* ptr2 = 1;
int* const ptr3 = 2;

对于上面三个语句,以我们对于const的理解:

  1. ptr1ptr1指向的内容都不可以更改
  2. ptr2指向的内容不可以更改
  3. ptr3本身不能更改

我们都知道:const T* 是不允许转换为T*。(除非使用const_cast去掉const属性)这些都是我们所了解的,那么如果加上二级指针呢?
例如下面代码:

const int d = 0;   
const int* c = &d;   //1
int e = 1;   
int *f = &e;        //2
int **b = &f;       //3
const int **a = b; //4
*a = c;             //5

对于上面所标识的5条语句,你觉得有没有错误的呢?

编译器会告诉你,语句4是错误的!!
在这里插入图片描述
这个时候就要问为什么

我们来分析一下:

  1. 首先我们来看,这个赋值的过程,来看是否有权限的放大问题。首先,创建一个const变量d,然后一个创建了一个const int*的指针指向这个变量,没有问题,是一个权限的平移。然后略过创建e,f,b过程,来到const int **a = b语句,从权限来看,这似乎是没有问题的,a是一个指针的指针,对于a指向的指针的指向内容一个const内容,而b指针指向的指针的指向内容不是一个const内容,似乎看来这是一个权限的缩小。指向是有潜在有问题的!

  2. 我们用b初始化了a,那么修改*a,就是修改*b,经过了语句5,此时*a*b都指向了c。发现了吗?c是一个const int* 类型,而b是一个int* 类型。没错,这里发生了什么?间接地使const int*类型转换为了int*类型(违背了上面的原则!)。即使是我们去掉了语句5,结果仍然不会通过!
    在这里插入图片描述

  3. 下面我们作图来解释关系
    在这里插入图片描述

所以:int ** 不能转换为 const int ** !!!这是为了以绝后患。如果在const int **声明的时候做如下声明:const int* const *a = b 那么语句*a = c就不会通过编译,就不会出现报错的问题了!
在这里插入图片描述
那么有了以上的一些储备,我们来看如下的代码:

class A{};void f(const A** p){}
void g(const A* const *p){}
void k(const A*& p){}int main()
{const A* ca = new A;A* a = new A;A** p = &a;k(ca); // 1f(p);  // 2g(p);  // 3// ……return 0;
}

在这个代码中,你能看出来语句1,2,3哪些有问题,为什么呢?

还有什么经验细节,都欢迎大家分享!

完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术对暴力的削弱

信息时代的大政治分析&#xff1a;效率对暴力的颠覆 一、工业时代勒索逻辑的终结 工厂罢工的消亡 1930年代通用汽车罢工依赖工厂的物理集中、高资本投入和流水线脆弱性&#xff0c;通过暴力瘫痪生产实现勒索。 信息时代企业分散化、资产虚拟化&#xff08;如软件公司可携带代码…

深入理解分布式锁——以Redis为例

一、分布式锁简介 1、什么是分布式锁 分布式锁是一种在分布式系统环境下&#xff0c;通过多个节点对共享资源进行访问控制的一种同步机制。它的主要目的是防止多个节点同时操作同一份数据&#xff0c;从而避免数据的不一致性。 线程锁&#xff1a; 也被称为互斥锁&#xff08…

yolo训练用的数据集的数据结构

Football Players Detection using YOLOV11 可以在roboflow上标注 Sign in to Roboflow 训练数据集只看这个data.yaml 里面是train的image地址和classnames 每个image一一对应一个label 第一个位是分类&#xff0c;0是classnames[0]对应的物体&#xff0c;现在是cuboid &…

Redis 使用及命令操作

文章目录 一、基本命令二、redis 设置键的生存时间或过期时间三、SortSet 排序集合类型操作四、查看中文五、密码设置和查看密码的方法六、关于 Redis 的 database 相关基础七、查看内存占用 一、基本命令 # 查看版本 redis-cli --version 结果&#xff1a;redis-cli 8.0.0red…

Java大师成长计划之第13天:Java中的响应式编程

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 随着现代应用程序的复杂性增加&…

华为私有协议Hybrid

实验top图 理论环节 1. 基本概念 Hybrid接口&#xff1a; 支持同时处理多个VLAN流量&#xff0c;且能针对不同VLAN配置是否携带标签&#xff08;Tagged/Untagged&#xff09;。 核心特性&#xff1a; 灵活控制数据帧的标签处理方式&#xff0c;适用于复杂网络场景。 2. 工作…

K8s 常用命令、对象名称缩写汇总

K8s 常用命令、对象名称缩写汇总 前言 在之前的文章中已经陆续介绍过 Kubernetes 的部分命令&#xff0c;本文将专题介绍 Kubernetes 的常用命令&#xff0c;处理日常工作基本够用了。 集群相关 1、查看集群信息 kubectl cluster-info # 输出信息Kubernetes master is run…

【HDLBits刷题】Verilog Language——1.Basics

目录 一、题目与题解 1.Simple wire&#xff08;简单导线&#xff09; 2.Four wires&#xff08;4线&#xff09; 3.Inverter&#xff08;逆变器&#xff08;非门&#xff09;&#xff09; 4.AND gate &#xff08;与门&#xff09; 5. NOR gate &#xff08;或非门&am…

C语言|递归求n!

C语言| 函数的递归调用 【递归求n!】 0!1; 1!1 n! n*(n-1)*(n-2)*(n-3)*...*3*2*1; 【分析过程】 定义一个求n&#xff01;的函数&#xff0c;主函数直接调用 [ Factorial()函数 ] 1 用if语句去实现&#xff0c;把求n!的情况列举出来 2 if条件有3个&#xff0c;n<0; n0||n…

Android第四次面试总结之Java基础篇(补充)

一、设计原则高频面试题&#xff08;附大厂真题解析&#xff09; 1. 单一职责原则&#xff08;SRP&#xff09;在 Android 开发中的应用&#xff08;字节跳动真题&#xff09; 真题&#xff1a;“你在项目中如何体现单一职责原则&#xff1f;举例说明。”考点&#xff1a;结合…

OpenHarmony GPIO应用开发-LED

学习于&#xff1a; https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-develop.md https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-des.md 通过OpenHarmony官方文档指导可获知&#xff1a;芯片厂…

XILINX原语之——xpm_fifo_async(异步FIFO灵活设置位宽、深度)

目录 一、"fwft"模式&#xff08;First-Word-Fall-Through read mode&#xff09; 1、写FIFO 2、读FIFO 二、"std"模式&#xff08;standard read mode&#xff09; 1、写FIFO 2、读FIFO 调用方式和xpm_fifo_sync基本一致&#xff1a; XILINX原语之…

系统学习算法:动态规划(斐波那契+路径问题)

题目一&#xff1a; 思路&#xff1a; 作为动态规划的第一道题&#xff0c;这个题很有代表性且很简单&#xff0c;适合入门 先理解题意&#xff0c;很简单&#xff0c;就是斐波那契数列的加强版&#xff0c;从前两个数变为前三个数 算法原理&#xff1a; 这五步可以说是所有…

《让内容“活”起来:Flutter社交应用瀑布流布局的破界实践》

用户动态的展示方式如同舞台的布景&#xff0c;直接影响着观众——用户的体验。而瀑布流布局&#xff0c;以其独特的美感和高效的信息展示能力&#xff0c;成为众多社交应用的心头好。当我们滑动着Instagram、Pinterest&#xff0c;或是国内热门的小红书&#xff0c;那种内容如…

微机控制技术复习【一】

填空题&#xff1a; 简答题&#xff1a; 1、什么是计算机控制系统?其典型形式有哪些? 2、给出 DDC &#xff08;直接数字控制&#xff09;控制系统结构框图&#xff0c;并说明各组成部分的作用&#xff1f; 3、采样周期选择的理论依据是什么?工程应用中应如何选择?选择采样…

前端学习基础—VScode环境配置及html基础知识

作为初学者&#xff0c;一个好的开发环境能极大地提高理解与学习的效率&#xff0c;本文分享我的VScode环境配置方法&#xff0c;涵盖插件、主题、快捷键等&#xff0c;希望能助你快速搭建舒适边界的前端学习环境。 一、VSCode环境配置 首先找到vscode插件商店&#xff0c;在这…

【一】 基本概念与应用领域【830数字图像处理】

考纲 文章目录 1 概念2005甄题【名词解释】2008、2012甄题【名词解释】可考题【简答题】可考题【简答题】 2 应用领域【了解】2.1 伽马射线成像【核医学影像】☆2.2 X射线成像2.3 紫外波段成像2.4 可见光和红外波段成像2.5 微波波段成像2.6 无线电波段成像2.7 电子显微镜成像2…

QuecPython错误码汇总

QuecPython中定义的各种错误代码常量 错误码常量错误码释义QUEC_PY_FAIL-1Generic failure codesQUEC_PY_OK0Quec_py value indicating success (no error)QUEC_PY_EPERM1Operation not permittedQUEC_PY_ENOENT2No such file or directoryQUEC_PY_ESRCH3No such processQUEC_…

C++学习-入门到精通-【4】函数与递归入门

C学习-入门到精通-【4】函数与递归入门 函数与递归入门 C学习-入门到精通-【4】函数与递归入门一、 数学库函数sqrt()ceil()cos()exp()fabs()floor()fmod()log()log10()pow()sin()tan()总结 二、具有多个形参的函数定义三、函数原型、函数签名和实参的强制类型转换函数原型函数…

天线测试报告解读学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、无源测试和有源测试二、无源测试报告1.驻波2.回损3.史密斯圆图4.效率5.增益6.天线方向图7.天线隔离度8.无源测试总结 三、有源测试报告1.TRP与TIS2.测试指标…