從C++開始的編程生活(3)——引用類型、內聯inline和nullptr

前言

本系列文章承接C語言的學習,需要有C語言的基礎才能學會哦~
第3篇主要講的是有關于C++的引用類型內聯inlinenullptr
C++才起步,都很簡單呢!

目錄

前言

引用類型

基本語法

特性

應用

const引用

基本語法

引用與指針的關系

內聯inline

nullptr


引用類型

即對同一塊連續存儲空間,多取一個標識符(別名)語法上不開辟空間(但是匯編底層也是用指針實現的)

基本語法

int a = 0;
int& b = a;

如上,引用類型的定義方式為:類型& 引用別名 = 引用對象(“類型”,要與引用對象相同)。
這里表示引用b為a的別名
引用類型變量同原變量指向同一空間,即a,b都指向同一塊空間。

int a = 0;
int& b = a;
int& c = a;
//也可以給別名取別名
int& d = c;
//運行代碼,四次輸出的地址都相同,可知引用類型與原變量a指向同一個地址
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;

而且,可以給別名起別名(如上代碼)。
一個變量可以有多個別名

特性

①引用在定義時必須初始化
②一個變量可以有多個別名。
③引用不可以再改變指向。

應用

引用傳參和引用做返回值的時候減少拷貝,從而提高效率。而且改變引用類型對象同時會改變被引用對象

struct A
{int arr[1000];//占用空間大
};
//不使用引用傳參和指針傳參
int Func(A aa)
{//此處需要拷貝一個占用較大的A類型,效率低return aa.arr[0];
}
int& Func2(A& aa)
{//此處返回值和傳參都無需拷貝return aa.arr[0];//數組首元素
}
//并且,若修改返回的值,數組的首元素同時也會被修改。
int main()
{struct A aa;for (int i = 0; i < 1000; i++){aa.arr[i] = i;}//首元素為0,輸出為1cout << ++Func2(aa) << endl;return 0;
}

首先,將返回值傳回時,還會開辟一個臨時對象存儲返回值。這里使用了引用作返回值。
然后,將引用類型作為臨時對象返回,無需再進行拷貝無需開辟空間,因為引用是被引用對象的別名,可以認為是同一個變量。
而且可以通過修改返回值,達到修改被引用對象的作用
調用Func2,可以Func2(aa)++,改變返回值,即可修改原數組的首元素
調用Func,Func(aa)++會報錯,因為返回的是個int類型數據,他不是一個左操作數。


注意,不可以出現野引用現象(類似野指針)!!

const引用

const引用,用于引用const對象,也可以引用普通對象。(const對象,不可被賦值,必須初始化)

基本語法

const int a = 0;
const int& b = a;

引用const對象,要使用const引用。否則·······

這是一個關于訪問權限的問題(指針和引用才有)。

訪問權限演示
//①
const int a = 0;
//!!錯誤演示!!
int &b = a;//int&引用指向的對象是可以修改的,這里放大了訪問權限
//!!正確演示!!
const int& ra = a;//②
int c = 10;
const int&rc = c;//該引用為訪問權限為const,縮小了權限,是允許的
//因此↓
c++;//c可以被修改
rc++;//不可以通過rc修改c//③
double d = 12.34;
const int& rd = d;//d先要進行類型轉換轉為int,中間產生臨時const對象,傳給rd時要求rd也是const引用
void func(const int& rx)
{int ret = rx;return ret;
}
int e = 10;
const int& re = e * 10;//e * 10的中間結果為臨時const對象,同上處理
func(e);//e的權限縮小為const
func(e * 3);//e * 3為臨時const對象,函數傳參要為const引用
//綜上,類型轉換、中間值、傳參等情況可能會出現訪問權限的問題

?C++在類型轉換或者多次運算時,中間結果也為const對象

引用與指針的關系

①指針和引用相輔相成,各有特點,不可替代
②在語法上,引用不開辟空間存儲指針變量要開辟空間存儲
引用必須初始化指針可以不初始化(只是建議要初始化)。
引用可以直接訪問對象指針還需要解引用
在sizeof中,表達含義不同,引用,則為所引用的類型的大小指針,則是指向地址空間的字節個數
指針容易出現空指針和野指針引用很少會出現野引用,引用使用起來更安全。
⑦因為引用在初始化之后就不可以再賦值,因此不可以用在鏈表等數據結構中

內聯inline

inline修飾的函數,叫作內聯函數。C++編譯器會在調用的地方直接展開內斂函數。它設計的目的就是要平替C語言的宏避免宏的坑

注:define宏函數的使用要點
①宏函數最后,不可加分號

#define ADD(x, y) ((x)+(y));
cout << ADD(1,2) << endl;//會報錯,展開后多了個分號

②宏函數需要加內部的括號
③宏函數需要加外部的括號
都是為了避免宏函數展開時,因運算符優先級的問題導致運算順序沒有滿足實際需要,從而發生錯誤
宏函數的好處:函數展開,不需要開辟棧幀但是實現復雜容易出錯展開后代碼量大不可以調試
內聯既保留了不用開辟棧幀的優點,而且沒有宏的坑。

在vs編譯器的debug版本下,內聯默認不展開,inline修飾會忽略,這是為了能夠展開調試(展開了就和宏一樣無法調試了)。可以設置修改為不分內聯函數展開,即只展開短小函數,遞歸函數等復雜函數不展開。

如圖,可設置為簡單inline函數展開。

究竟要多復雜的函數才會不展開呢?這取決于編譯器自身,不同的編譯器在這一點上就不同。在匯編層,不展開的內聯函數會有call指令出現。

假設Add函數在匯編層內有100條指令,在工程中調用了10000次
若不展開,匯編層一共只有10000條call指令;
若展開,匯編層一共有100 * 10000條指令。
因此,若展開復雜函數,會讓代碼量劇增,會導致指令占用內存變多。

且內聯函數不建議聲明和定義分離在兩個不同的文件上,可能會出現鏈接錯誤。因為內聯函數沒有地址。

nullptr

NULL在C++中為int類型的0,在C語言中為空指針,即void*類型。但在C++中void*不可以再轉類型,這就導致無法實現泛式函數
nullptr為特殊關鍵字,可以轉換為任意類型的指針,在C++中要用nullptr來定義空指針。

?~~本文完結!!感謝觀看!!歡迎來我博客做客~~??

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

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

相關文章

makefile-- 其他函數

fuctionsjoin?$(join <list1>,<list2>)連接函數把list2 中單詞對應的添加到list1 的后面若list1 的單詞個數> list2 &#xff0c;多出的list1 保持不變若list2 的單詞個數> list21&#xff0c;多出的list2 添加到list1 后面foreach?$(foreach <var>…

【unity實戰】使用unity的Navigation+LineRenderer實現一個3D人物尋路提前指示預測移動軌跡的效果,并可以適配不同的地形

文章目錄 前言 實戰 1、實現要點 1.1 NavMesh.CalculatePath方法計算兩個點之間的導航路徑 1.2 尋找投射的地面點 2、代碼實現如下 3、烘培地面導航網格 4、添加導航玩家代理,并掛載前面的腳本 5、創建Line Renderer,并放在角色下面作為子物體 6、運行游戲查看效果 專欄推薦 …

寶塔申請證書錯誤,提示 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘

遇到"module OpenSSL.crypto has no attribute sign"錯誤時&#xff0c;通常是由于pyOpenSSL版本兼容性問題導致的?。以下是解決方案&#xff1a;通過SSH連接到服務器&#xff0c;執行以下命令安裝指定版本的pyOpenSSL&#xff1a;btpip install pyOpenSSL24.2.1-U然…

【ffmpeg源碼學習】詳解pkg-config的作用

文章目錄 前言 一、什么是pkg-config? 二、為什么需要 pkg-config? 三、pkg-config 的工作原理 3.1 .pc 文件 3.2 查詢流程 3.3 查找路徑 四、pkg-config 在 FFmpeg 中的作用 五、pkg-config 的常用命令 六、在項目中的實際用法 6.1 makefile示例: 6.2 cmake示例: 6.3 gcc命…

PHPStorm攜手ThinkPHP8:開啟高效開發之旅

目錄一、前期準備1.1 開發環境搭建1.2 配置 Xdebug二、PHPStorm 集成 ThinkPHP82.1 導入 ThinkPHP8 項目2.2 配置 PHP 解釋器2.3 配置服務器三、ThinkPHP8 項目開發基礎3.1 項目結構剖析3.2 控制器與方法創建3.3 視圖渲染與數據傳遞四、數據庫操作與模型定義4.1 數據庫配置4.2 …

HTTP性能優化實戰技術詳解(2025)

HTTP性能優化實戰技術詳解本文基于提供的文章大綱&#xff0c;對HTTP性能優化進行擴展說明。文章結構清晰&#xff0c;從理解瓶頸到具體優化策略&#xff0c;再到監控與高級技巧&#xff0c;逐步展開。每個部分包括背景介紹、核心原理、實施步驟、示例或工具推薦&#xff0c;確…

探索文件系統:軟硬鏈接的奧秘

目錄 1.文件系統 1.1 磁盤物理存儲結構 1.2 磁盤邏輯存儲結構 1.3 inode編號 2. 軟硬鏈接 2.1 軟鏈接 2.2 硬鏈接 2.3 目錄文件的軟硬鏈接 1.文件系統 在一臺電腦中&#xff0c;大部分文件都不是被打開的&#xff0c;這些文件都在磁盤中進行保存。已經打開的文件需要管…

3x3矩陣教程

3x3矩陣教程 1. 簡介 三維矩陣是線性代數中的重要概念&#xff0c;用于表示三維空間中的線性變換。本教程將介紹如何使用C實現三維矩陣的基本運算和變換。 2. 代碼實現 2.1 頭文件 (matrix3x3.h) #ifndef MATRIX3X3_H #define MATRIX3X3_H#include <array> #include <…

深度學習前置知識

文章目錄介紹數據操作張量張量的定義1. **張量的維度&#xff08;Rank&#xff09;**2. **張量的形狀&#xff08;Shape&#xff09;**簡單的數據預處理&#xff08;插值線性代數微積分概率論1. 基本概念(1) 隨機試驗與事件(2) 概率公理&#xff08;Kolmogorov公理&#xff09;…

XSS學習總結

一.XSS概述 跨站腳本攻擊&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一種常見的網絡安全漏洞&#xff0c;攻擊者通過在網頁上注入惡意腳本代碼&#xff0c;從而在用戶的瀏覽器上執行惡意操作。這些腳本可以是 JavaScript、HTML 或其他網頁腳本語言。一旦用…

計算機網絡中:傳輸層和網絡層之間是如何配合的

可以把網絡層和傳輸層想成一個“快遞系統”&#xff1a; 網絡層&#xff08;IP 層&#xff09; 郵政系統&#xff1a;只負責把“包裹”&#xff08;IP 數據報&#xff09;從 A 地搬到 B 地&#xff0c;不保證順序、不保證不丟、不保證不重復。傳輸層&#xff08;TCP/UDP 層&am…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 用戶登錄實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解用戶登錄實現 視頻在線地址&#xff1a; …

Redis主從復制數據同步實現原理詳細介紹

文章目錄一、主從復制的概念二、全量復制&#xff08;完整重同步&#xff09;三、增量復制&#xff08;部分重同步&#xff09;1. 增量復制的核心思想2. 增量復制的實現3. 復制偏移量&#xff08;replicationoffset&#xff09;4. 復制積壓緩沖區&#xff08;replicationbacklo…

docker 軟件bug 誤導他人 筆記

DockerDesktopInstaller.exe install --installation-dirX:\AI-AI\docker\pro\ 由于 Docker官方隨便修改安裝命令&#xff0c;這個在4.4一下是無法使用的&#xff0c;存在誤導他人

Python 進階(六): Word 基本操作

目錄 1. 概述2. 寫入 2.1 標題2.2 段落2.3 表格2.4 圖片2.5 樣式 3. 讀取 1. 概述 Word 是一個十分常用的文字處理工具&#xff0c;通常我們都是手動來操作它&#xff0c;本節我們來看一下如何通過 Python 來操作。 Python 提供了 python-docx 庫&#xff0c;該庫就是為 Wo…

OpenLayers 入門指南【三】:API概要

目錄一、官方文檔二、核心類三、總結一、官方文檔 首頁右側有四個欄目分別是 Docs(文檔):也可以理解為使用指南&#xff0c;涵蓋一下四個模塊 Quick Start(快速入門)&#xff1a;介紹如何快速引入并使用OpenLayers快速構建一個地圖應用FAQ(問答)&#xff1a;介紹一些常見問題的…

JAVA面試寶典 -《Kafka 高吞吐量架構實戰:原理解析與性能優化全攻略》

&#x1f680; Kafka 高吞吐量架構實戰&#xff1a;原理解析與性能優化全攻略 隨著大數據技術在日志收集、埋點監控、訂單流處理等場景的普及&#xff0c;Kafka 已成為流處理架構中的核心組件。它之所以能在海量數據場景下保持高吞吐、低延遲&#xff0c;源于其在架構層面和底…

把sudo搞壞了怎么修復:報錯sudo: /etc/sudo.conf is owned by uid 1000, should be 0

今天部署 NFS 的時候一不小心給/etc目錄下所有的文件都所有者給改了&#xff0c;然后使用sudo的時候就出現了下面的問題&#xff1a; sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudoers i…

VUE前端項目開發1.0.1版本

項目包含用戶權限管理、表單提交、數據上傳下載、儀表盤可視化等功能&#xff0c;非常適合新手從零開始學習Vue3前端開發&#xff0c;下述包含所有開發源代碼&#xff0c;敬請食用 廢話少說先上圖: 登陸界面: 儀表盤管理系統: 用戶管理: 對于普通用戶只有儀表盤和個人信息界…

低代碼平臺能否完全取代傳統前端開發

低代碼平臺不能完全取代傳統前端開發&#xff0c;主要原因包括靈活性有限、性能優化能力不足、復雜定制需求難以實現。 低代碼平臺盡管能快速開發出相對標準化的應用&#xff0c;但在處理復雜、個性化的業務需求時&#xff0c;明顯表現出不足。尤其在需要精細化控制UI界面、高性…