關于類型轉換的細節(隱式類型轉換的臨時變量和理解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.pswp.cn/diannao/81903.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81903.shtml
英文地址,請注明出處:http://en.pswp.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.測試指標…