C++Cherno 學習筆記day17 [66]-[70] 類型雙關、聯合體、虛析構函數、類型轉換、條件與操作斷點

b站Cherno的課[66]-[70]

  • 一、C++的類型雙關
  • 二、C++的union(聯合體、共用體)
  • 三、C++的虛析構函數
  • 四、C++的類型轉換
  • 五、條件與操作斷點——VisualStudio小技巧

一、C++的類型雙關

作用:在C++中繞過類型系統
在這里插入圖片描述

C++是強類型語言
有一個類型系統,不是所有東西都用auto去聲明
可以用auto,畢竟它也是一個關鍵字

但在JavaScript中,沒有變量類型的概念
在創建變量時,不需要聲明變量類型
當我們接受它作為函數的參數時,沒有真正的類型系統

但C++有一個類型系統
當我們創建變量的時候,必須聲明整數或雙精度數或布爾數或結構體或者類等等
然而,這種類型系統并不像在其他語言中那樣強制,比如java
它們的類型很難繞開,包括C#也是
你雖然也可以繞開類型系統,但要做更多的工作

在C++中,雖然類型是由編譯器強制執行的,但您可以直接訪問內存
這意味著在代碼中一直使用這種類型,比如整數,但實際上,我現在要把這段內存,同樣的內存,當作double類型,或者是class類型等
可以很容易地繞過類型系統
你是否要用,取決于你的實際情況
在某些情況下,您絕對不應該規避類型系統,因為類型系統存在是有原因的

#include <iostream>int main()
{int a = 50;//double value = a; 隱式轉換double value = (double)a; // 顯式轉換std::cout << value << std::endl;std::cin.get();
}

在這里插入圖片描述

#include <iostream>int main()
{int a = 50;//double value = a; 隱式轉換//double value = (double)a; 顯式轉換double& value = *(double*)&a;value = 0.0;std::cout << value << std::endl;std::cin.get();
}

在這里插入圖片描述

#include <iostream>struct Entity {int x, y;
};int main()
{Entity e = { 5, 8 };// 回到了原始的內存操作int* position = (int*)&e;int y = *(int*)((char*)&e + 4);std::cout << y << std::endl;std::cin.get();
}

在這里插入圖片描述
我們可以用不同的方式解析同一段內存,從而得到不同的結果,類型只是我們約定的解析內存的方式

類型雙關:我要把我擁有的這段內存,當作不同類型的內存來對待
我們需要做的只是將該類型作為指針,然后將其轉換為另一個指針
然后如果有必要,還可以對它進行解引用

二、C++的union(聯合體、共用體)

在這里插入圖片描述

聯合體有點像類類型,或者結構體類型
只不過它一次只能占用一個成員的內存
這意思是說,通常如果我們有一個結構體,我們聲明比如4個浮點數,
我們可以有4乘以4個字節在這個結構體中,總共是16個字節
因為我們有四個成員,而且很明顯
當你不斷向類或結構體中添加更多成員時,其大小會不斷增長

一個聯合體只能有一個成員
如果要聲明四個浮點數 ABCD 聯合體的大小仍然是4個字節,當改變ABCD的值的時候,內存是一樣的
改變a設成5 b的值也是5

你可以像使用結構體或類一樣使用它們
你也可以給它添加靜態函數或者普通函數、方法等等

通常union是匿名使用的,但是匿名union不能含有成員函數

通常被用來做類型雙關,union可讀性更強

#include <iostream>struct Vector2 {float x, y;
};struct Vector4 {float x, y, z, w;
};void PrintVector2(const Vector2& vector)
{std::cout << vector.x << "," << vector.y << std::endl;
}int main()
{struct Union{union{float a;int b;};};Union u;u.a = 2.0f;std::cout << u.a << "," << u.b << std::endl;
}

在這里插入圖片描述

#include <iostream>struct Vector2 {float x, y;
};struct Vector4 {union{// 匿名的,只是一種數據結構,并沒有添加任何東西struct{float x, y, z, w;};struct{Vector2 a, b;};};
};void PrintVector2(const Vector2& vector)
{std::cout << vector.x << "," << vector.y << std::endl;
}int main()
{Vector4 vector = { 1.0f,2.0f,3.0f,4.0f };//vector.x = 2.0f;PrintVector2(vector.a);PrintVector2(vector.b);vector.z = 500.0f;std::cout << "--------------------------" << std::endl;PrintVector2(vector.a);PrintVector2(vector.b);std::cin.get();
}

在這里插入圖片描述
union里的成員會共享內存,分配的大小是按最大成員的sizeof, 視頻里有兩個成員,也就是那兩個結構體,改變其中一個另外一個里面對應的也會改變. 如果是這兩個成員是結構體struct{ int a,b} 和 int k , 如果k=2 ; 對應 a也=2 ,b不變; union我覺得在這種情況下很好用,就是用不同的結構表示同樣的數據 ,那么你可以按照獲取和修改他們的方式來定義你的 union結構 很方便

一個聯合體的應用場景:開發弱類型語言。例如js,let a=2; 緊接著寫a=“abc”;變量a在一個時間點只會是一種類型,那就可以定義一個聯合體來表示變量的值。

三、C++的虛析構函數

復習:析構函數~(銷毀對象) 虛函數virtual

析構函數:在銷毀對象時運行,卸載變量,清理使用過的內存,同時適用于棧和堆分配的對象
虛函數:允許我們在子類中重寫方法

虛析構函數:二者結合,對于處理多態問題非常重要

#include <iostream>class Base
{
public:Base() { std::cout << "Base Constructor\n"; }~Base() { std::cout << "Base Destrcctor\n"; }
};class Derived : public Base
{
public:Derived() { std::cout << "Derived Constructor\n"; }~Derived() { std::cout << "Derived Destrcctor\n"; }
};int main()
{Base* base = new Base();delete base;std::cout << "----------------\n" << std::endl;Derived* derived = new Derived();delete derived;std::cin.get();
}

在這里插入圖片描述

int main()
{Base* base = new Base();delete base;std::cout << "----------------\n" << std::endl;Derived* derived = new Derived();delete derived;std::cout << "----------------\n" << std::endl;Base* poly = new Derived();delete poly;std::cin.get();
}
// 只有基類的析構函數被調用,派生類的的析構函數沒有被調用
// 這樣會導致內存泄露

在這里插入圖片描述
虛析構函數不是覆寫析構函數,而是加上一個析構函數
如果我把基類析構函數改為虛函數
它實際上會調用兩個(析構函數)
它會先調用派生類析構函數,然后在層次結構中向上,調用基類析構函數
標記為virtual,意味著c++就會知道在層次結構下的這個方法可能被重寫了

一定要確保聲明析構函數是虛函數,如果你允許它有子類的話

!!!如果用基類指針來引用派生類對象,那么基類的析構函數必須是 virtual 的,否則 C++ 只會調用基類的析構函數,不會調用派生類的析構函數。

四、C++的類型轉換

C++是強類型語言,意味著存在一個類型系統,并且類型是強制的

#include <iostream>class Base
{
public:Base() {}~Base() {}
};class Derived : public Base
{
public:Derived() {}~Derived() {}
};class AnotherClass : public Base
{
public:AnotherClass() {}~AnotherClass() {}
};int main()
{	// 隱式轉換//int a = 5;//double value = a;double value = 5.25;//int a = value;//int a = (int)value;double a = value + 5.3;std::cout << a << std::endl;std::cin.get();
}

在這里插入圖片描述

#include <iostream>class Base
{
public:Base() {  }~Base() {  }
};class Derived : public Base
{
public:Derived() {  }~Derived() {  }
};class AnotherClass : public Base
{
public:AnotherClass() {}~AnotherClass() {}
};int main()
{	// 隱式轉換//int a = 5;//double value = a;double value = 5.25;//int a = value;//int a = (int)value;// C語言風格類型轉換double a = (int)value + 5.3;std::cout << a << std::endl;std::cin.get();
}

在這里插入圖片描述

#include <iostream>class Base
{
public:Base() {  }virtual ~Base() {  }
};class Derived : public Base
{
public:Derived() {  }~Derived() {  }
};class AnotherClass : public Base
{
public:AnotherClass() {}~AnotherClass() {}
};int main()
{	Derived* derived = new Derived();Base* base = derived;Derived* ac = dynamic_cast<Derived*>(base);std::cin.get();
}

C++風格 共四種主要的cast 類型轉換操作符
一個是 static_cast,還有reinterpret_cast、dynamic_cast、const_cat

static_cast:靜態類型轉換
reinterpret_cast:把這段內存重新解釋成別的東西
const_cat:移除或添加變量的const限定
dynamic_cast:很好的方法來查看是否轉換成功,與運行時類型信息RTTI(runtime type information)緊密相關
regex正則表達式

五、條件與操作斷點——VisualStudio小技巧

關于條件與操作(conditions and actions)應用在斷點上
操作斷點是允許我們采取某種動作
一般是在碰到斷點時打印一些東西到控制臺

兩種類型的操作斷點:
操作斷點和條件斷點
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76144.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

011_異常、泛型和集合框架

異常、泛型和集合框架 異常Java的異常體系異常的作用 自定義異常異常的處理方案異常的兩種處理方式 泛型泛型類泛型接口泛型方法、通配符和上下限泛型支持的類型 集合框架集合體系結構Collection Collection集合Collection的遍歷方式認識并發修改異常問題解決并發修改異常問題的…

Kubernetes 集群搭建(三):使用dashboard用戶界面(需要訪問外網獲取yaml)

&#xff08;一&#xff09;簡介 K8s Dashboard是Kubernetes提供的一種基于Web的用戶界面工具&#xff0c;用于可視化地管理和監控Kubernetes集群 主要功能&#xff1a; 資源查看與管理&#xff1a; 查看Kubernetes集群中的各種資源&#xff0c;如節點、Pod、服務、部署等。 對…

【數據挖掘】嶺回歸(Ridge Regression)和線性回歸(Linear Regression)對比實驗

這是一個非常實用的 嶺回歸&#xff08;Ridge Regression&#xff09;和線性回歸&#xff08;Linear Regression&#xff09;對比實驗&#xff0c;使用了 scikit-learn 中的 California Housing 數據集 來預測房價。 &#x1f4e6; 第一步&#xff1a;導入必要的庫 import num…

大疆無人機系列知識

目錄 知識 開發者文檔 &#xff08;上云&#xff09; 無人機的應用 知識 大疆行業無人機接入音視頻平臺協議詳解_大疆無人機 視頻流-CSDN博客 開發者文檔 &#xff08;上云&#xff09; 上云API 無人機的應用 【大疆無人機地圖測繪技術學習&#xff1a;高精度、高效率的…

CNN注意力機制的進化史:深度解析10種注意力模塊如何重塑卷積神經網絡

&#x1f31f; 引言&#xff1a;注意力為何改變CNN的命運&#xff1f; 就像人類視覺會優先聚焦于重要信息&#xff0c;深度學習模型也需要"學會看重點"。從2018年SENet首提通道注意力&#xff0c;到2024年SSCA探索空間-通道協同效應&#xff0c;注意力機制正成為CNN…

Linux/樹莓派網絡配置、遠程登錄與圖形界面訪問實驗

一.準備工作 1.修改網絡適配器&#xff08;選擇本機網卡&#xff09; 2.創建一個新的用戶。 3.使用新用戶登錄&#xff0c;使用ip a指令查看IP&#xff08;現代 Linux 發行版&#xff08;如 Ubuntu、Debian、CentOS、Fedora 等&#xff09;&#xff09;。 通過sudo arp-sca…

Python----TensorFlow(TensorFlow介紹,安裝,主要模塊,高級功能)

一、TensorFlow TensorFlow 是由谷歌大腦團隊于 2015 年推出的開源機器學習框架。作為深度學習的第二代系統&#xff0c;TensorFlow 支持多種編程語言&#xff0c;包括 Python、C、Java 和 Go&#xff0c;廣泛應用于 CNN、RNN 和 GAN 等深度學習算法。 TensorFlow 可以…

【動態規劃】 深入動態規劃 回文子串問題

文章目錄 前言例題一、回文子串二、 最長回文子串三、回文串分割IV四、分割回文串II五、最長回文子序列六、讓字符串成為回文串的最小插入次數 結語 前言 那么&#xff0c;什么是動態規劃中的回文子串問題呢&#xff1f; 動態規劃中的回文子串問題是一個經典的字符串處理問題。…

lodash庫介紹(一個現代JavaScript實用工具庫,提供模塊化、性能優化和額外功能)JavaScript庫(防抖、節流、函數柯里化)JS庫

https://www.lodashjs.com/ 文章目錄 Lodash庫全解析簡介核心優勢一致性API模塊化設計性能優化 常用功能分類數組操作對象操作函數增強 高級應用場景數據轉換鏈函數組合 性能考量大數據集處理 最佳實踐按需引入利用FP模塊 結語 Lodash庫全解析 簡介 Lodash是一個現代JavaScri…

Spring MVC 國際化機制詳解(MessageSource 接口體系)

Spring MVC 國際化機制詳解&#xff08;MessageSource 接口體系&#xff09; 1. 核心接口與實現類詳解 接口/類名描述功能特性適用場景MessageSource核心接口&#xff0c;定義消息解析能力支持參數化消息&#xff08;如{0}占位符&#xff09;所有國際化場景的基礎接口Resource…

PyTorch張量范數計算終極指南:從基礎到高階實戰

在深度學習領域&#xff0c;張量范數計算是模型正則化、梯度裁剪、特征歸一化的核心技術。本文將以20代碼實例&#xff0c;深度剖析torch.norm的9大核心用法&#xff0c;并揭示其在Transformer模型中的關鍵應用場景。 &#x1f680; 快速入門&#xff08;5分鐘掌握核心操作&…

榮耀90 GT信息

外觀設計 屏幕&#xff1a;采用 6.7 英寸 AMOLED 榮耀綠洲護眼屏&#xff0c;超窄邊框設計&#xff0c;其上邊框 1.6mm&#xff0c;左右黑邊 1.25mm&#xff0c;屏占較高&#xff0c;帶來更廣闊的視覺體驗。屏幕還支持 120Hz 自由刷新率&#xff0c;可根據使用場景自動切換刷新…

【Java中級】11章、枚舉 - java引用數據類型,枚舉介紹、快速入門,了解枚舉類的基本使用方式【1】

文章內容&#xff1a; 自定義實現枚舉enum關鍵字實現枚舉 ??內容涉及枚舉的定義&#xff0c;快速入門&#xff0c;注意事項和小題鞏固知識點 &#x1f308; 跟著B站一位老師學習的內部類內容&#xff0c;現寫這篇文章為學習內部類的小伙伴提供思路支持&#xff0c;希望可以一…

局域網訪問 Redis 方法

局域網訪問 Redis 方法 默認情況下&#xff0c;Redis 只允許本機 (127.0.0.1) 訪問。如果你想讓局域網中的其他設備訪問 Redis&#xff0c;需要 修改 Redis 配置&#xff0c;并確保 防火墻放行端口。 方法 1&#xff1a;修改 Redis 配置 1. 修改 redis.conf&#xff08;或 me…

如何應對客戶頻繁變更需求

如何應對客戶頻繁變更需求&#xff1f;要點包括&#xff1a; 快速響應、深入溝通、靈活規劃、過程記錄、風險管控。這些策略既能降低項目失控風險&#xff0c;也能幫助團隊在變動環境中保持高效率。其中深入溝通尤為關鍵&#xff0c;它不僅能夠讓團隊第一時間了解客戶意圖&…

Set 集合

默認情況下&#xff0c; Scala 使用的是不可變集合&#xff0c; 如果你想使用可變集合&#xff0c; 需要引用 scala.collection.mutable.Set Set 默認是不可變集合&#xff0c;數據無序 數據不可重復 遍歷集合 創建可變集合 mutable.Set 打印集合 集合添加元素 向集合中…

最新 OpenHarmony 系統一二級目錄整理

我們在學習 OpenHarmony 的時候&#xff0c;如果對系統的目錄結構了解&#xff0c;那么無疑會提升自己對 OpenHarmony 更深層次的認識。 于是就有了今天的整理。 首先在此之前&#xff0c;我們要獲取源碼 獲取源碼的方式 OpenHarmony 主干代碼獲取 方式一&#xff08;推薦&am…

STL常用容器整理

STL常用容器操作整理 STL常用容器操作整理&#xff08;string/vector/set/map&#xff09;一、string&#xff08;字符串&#xff09;構造函數元素訪問修改操作容量操作子串與查找 二、vector&#xff08;動態數組&#xff09;構造函數元素訪問修改操作容量操作 三、set&#x…

Unity 實現傷害跳字

核心組件&#xff1a; Dotween TextMeshPro 過程軌跡如下圖&#xff1a; 代碼如下&#xff1a; using System.Collections; using System.Collections.Generic; using DG.Tweening; using TMPro; using UnityEngine; using UnityEngine.Pool;public class …

Ubuntu 22.04 AI大模型環境配置及常用工具安裝

一、基礎環境準備 1.1 系統準備 建議使用 Ubuntu22.04 以下配置皆以 Ubuntu22.04 系統版本為例 1.2 安裝git apt-get update && apt-get install git -y1.3 安裝 Python 3.9 【建議安裝 3.10】&#xff08;安裝miniconda或者conda來管理虛擬環境&#xff09; wget …