c++詳解系列(引用指針)

目錄

1.什么是引用

2.引用的定義

?3.引用的特性

4.引用的使用

4.1引用傳參

4.2傳引用返回

5.const引用(在引用的定義前用const修飾)

5.1對于引用

5.2對于指針

6.引用&指針

總結


1.什么是引用

引用就是給變量起別名,一個變量可以有多個別名,引用變量不會另辟空間,語法上和被引用的變量公用同一塊空間,就像一個人可以有多個稱號,所有稱號都是再說一個人。

2.引用的定義

類型& 引用別名 =被引用對象;

?3.引用的特性

  • 引用在定義時必須初始化
  • 一個變量可以有多個引用
  • 引用一旦引用一個實體就不能再引用其他實體
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
int main()
{const char* jjxt= "帥哥";const char*& x = jjxt;const char*& bozhu = jjxt;int a = 1;int& b = a;int& c = b;cout << jjxt << endl;cout << xxj << endl;cout << bozhu << endl;//const修飾的字符串沒法修改cout << a << endl;cout << b << endl;cout << c << endl;++b;//因為本質是同一塊空間里的同一個數據,一變全變cout << a << endl;cout << b << endl;cout << c << endl;return 0;
}

?

4.引用的使用

引用主要被用于引用傳參和做返回值時減少拷貝提高效率,和改變引用對象同時改變被引用對象(功能類似指針)在c++中大部分地方我們用引用代替指針,但是少部分地方任然離不開指針(比如鏈表,因為引用無法改變指向)

歸根結底是因為引用對和被引用對象公用同一空間 。

4.1引用傳參

void Swap(int* rx, int* ry)
{int tmp = *rx;*rx = *ry;*ry = tmp;
}void Swap(int& rx, int& ry)
{int tmp = rx;rx = ry;ry = tmp;
}

swap是典型的傳址調用函數,可以用傳引用代替。

4.2傳引用返回

int& func1()
{int ret = 0;return ret;  
}
int main()
{int& x = func1();cout << x << endl;return 0;
}

ret在函數棧幀銷毀時,空間已經被系統回收,該空間是否被覆蓋(被用于存放其他內容)是未知的,取決于編譯器,該函數的返回值是一個ret的一個引用,可以理解為系統給了一個臨時的引用變量int& tmp = ret,而引用x又對tmp進行引用,也就是說x和被銷毀的ret公用一個空間,這是危險的,畢竟我們不知道ret被銷毀后,原空間是什么狀態。

運行結果:

int& func1()
{int ret = 0;return ret;  
}
int& fun2()
{int y = 123;return y;
}
int main()
{int& x = func1();cout << x << endl;fun2();cout << x << endl;return 0;
}

?當我們創建于func1幾乎相同的,在vs環境中,編譯器將原來用于func1的函數棧幀空間分配給func2,導致原來局部變量ret使用的空間被覆蓋,此時再通過別名來訪問這個空間,就會發現期望的x值已經發生改變。

上述情況是基于被引用對象隨著函數棧幀銷毀而銷毀的情況,這種情況不推薦使用傳引用返回,那么反之,當被引用對象不會隨著函數棧幀的銷毀而銷毀時,傳引用返回的使用就會使函數更加便捷和靈活,我們推薦使用傳引用返回。

對于順序表中,查找和修改指定位置的函數,利回就用傳引用返能合二為一

這時SLat函數獨自就能完成讀寫的操作。?

5.const引用(在引用的定義前用const修飾)

被const修飾的對象具有常性,只能讀,不能寫,也就是訪問權限縮小(一般權限的放大縮小是對引用和指針來說的)

對于const修飾的對象,必須用const引用?

對于普通對象,const引用也能引用

這是因為,訪問權限在引用的過程中只能縮小不能放大

5.1對于引用

int main()
{const int a = 0;int& ra = a;return 0;
}

? ? ? ?這里就會報錯,權限被放大了。

5.2對于指針


int main()
{const int a = 0;int& ra = a;int b = 0;const int* p = &b;int* p2 = p;return 0;
}

指針的訪問權限被放大,所以報錯。(這里多提一點,被const修飾的指針,是它指向的變量具有常性,而不是指針本身具有常性)。

綜上所述,我們可以知道,在用引用傳參是盡量加上const,這樣不管被引用對象是否被const修飾,都可以進行傳參。

5.3類型轉換中的常性

和函數返回時,產生臨時變量一樣,類型轉換也會產生臨時變量。

產生的臨時變量為指定的類型且具有常性的。而跨類型引用本質上是對臨時變量的引用

int main()
{int i = 0;double& ri = i;int i = 0;const double& ri = i;
}

這里的引用,本質上是對具有常性double類型的臨時變量的引用。

6.引用&指針

  • 語法概念上,引用是給一個變量取別名,不開新空間,指針是直接創建一個指針變量來存地址,需要開辟空間。
  • 語法上,引用在定義時就要初始化,指針在語法上不強求。
  • 引用一旦確定被引用對象就不能更改,指針可以不斷改變指向的對象。
  • 引用可以直接訪問被引用對象,而指針需要解引用。
  • sizeof的含義不同,引用是被引用對象的類型大小,指針是地址所占字節個數,32位是4,64位是8。
  • 指針很容易出現野指針問題,引用相對安全一些。

二者在實踐中有重疊性,但又各有千秋,它們相輔相成,互相不可完全替代。

總結

基本概念
引用是為變量創建的別名,與被引用變量共享內存空間。一個變量可擁有多個引用

核心特性
1. 必須初始化
2. 可多級引用(一個變量多個別名)
3. 一旦綁定實體后不可更改引用對象

主要用途
1. 函數參數:替代指針實現傳址調用,更安全簡潔
2. 返回值:避免拷貝開銷,但需注意返回局部變量引用的風險

const引用
遵循"權限不放大"原則:const對象必須用const引用,普通對象可用const引用
類型轉換時會生成具有常性的臨時變量

與指針對比
1. 內存:引用不占額外空間,指針需要存儲地址
2. 安全性:引用更安全,不存在野引用問題
3. 靈活性:指針可重定向,引用一旦綁定不可更改
4. 訪問方式:引用直接訪問,指針需解引用

本質區別:引用是語法層面的別名機制,指針是底層的內存地址操作。兩者在C++中互補使用,各有適用場景

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

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

相關文章

深度學習loss總結(二)

對于目前深度學習主流任務學習,loss的設置至關重要。下面就不同任務的loss設置進行如下總結: (1)目標檢測 2D/3D目標檢測中的 Loss(損失函數)是訓練模型時優化目標的核心,通常包括位置、類別、尺寸、方向等多個方面。以下是目前 常見的 2D 和 3D 目標檢測 Loss 分類與…

【Linux網絡】netstat 的 -anptu 各個參數各自表示什么意思?

netstat 是一個網絡統計工具&#xff0c;它可以顯示網絡連接、路由表、接口統計、偽裝連接和多播成員資格。在 netstat 命令中&#xff0c;不同的參數可以用來定制輸出的內容。 你提到的 -anptu 參數組合各自的功能如下&#xff1a; -a (all): 顯示所有活動的連接和監聽端口。它…

[硬件電路-115]:模擬電路 - 信號處理電路 - 功能放大器工作分類、工作原理、常見芯片

功能放大器是以特定功能為核心的集成化放大電路&#xff0c;通過將運算放大器與外圍電阻、電容等元件集成在單一芯片中&#xff0c;實現標準化、高性能的信號放大功能。其核心優勢在于簡化設計流程、提升系統穩定性&#xff0c;并針對特定應用場景優化性能參數。以下從定義、分…

雙網卡UDP廣播通信機制詳解

UDP廣播通信機制詳解 一、通信流程分析 發送階段 通過Client.Bind(192.168.0.3, 60000)將UDP套接字綁定到指定網卡和端口設置RemoteHost "255.255.255.255"實現全網段廣播數據流向&#xff1a;192.168.0.3:60000 → 255.255.255.255:50000 接收階段 設備響應數據應返…

從遮擋難題到精準測量:激光頻率梳技術如何實現深孔 3D 輪廓的 2um 級重復精度?

一、深孔 3D 輪廓測量的遮擋困境深孔結構&#xff08;如航空發動機燃油噴嘴孔、模具冷卻孔&#xff09;因孔深大&#xff08;常超 100mm&#xff09;、深徑比高&#xff08;&#xff1e;10:1&#xff09;&#xff0c;其 3D 輪廓測量長期受限于光學遮擋難題。傳統光學測量技術&a…

.NET 依賴注入(DI)全面解析

文章目錄一、依賴注入核心原理1. 控制反轉(IoC)與DI關系2. .NET DI核心組件二、服務生命周期1. 三種生命周期類型三、DI容器實現原理1. 服務注冊流程2. 服務解析流程四、高級實現方法1. 工廠模式注冊2. 泛型服務注冊3. 多實現解決方案五、ASP.NET Core中的DI集成1. 控制器注入2…

K8S部署ELK(二):部署Kafka消息隊列

目錄 1. Kafka 簡介 1.1 Kafka 核心概念 &#xff08;1&#xff09;消息系統 vs. 流處理平臺 &#xff08;2&#xff09;核心組件 1.2 Kafka 核心特性 &#xff08;1&#xff09;高吞吐 & 低延遲 &#xff08;2&#xff09;持久化存儲 &#xff08;3&#xff09;分…

Rust進階-part1-智能指針概述-box指針

Rust進階[part1]_智能指針概述&box指針 智能指針概述 在Rust中,智能指針是一類特殊的數據結構,它們不僅像普通指針一樣可以引用數據,還帶有額外的元數據和功能。與普通指針不同,智能指針通常使用結構體實現,并且會實現 Deref 和 Drop 等特定的trait,以提供更強大的…

C++擴展 --- 并發支持庫(補充1)

C擴展 --- 并發支持庫&#xff08;下&#xff09;https://blog.csdn.net/Small_entreprene/article/details/149606406?fromshareblogdetail&sharetypeblogdetail&sharerId149606406&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link atom…

在Three.js中導入和添加自定義網格的最佳實踐 - 綜合指南

探索在Three.js中導入和添加自定義網格的最佳實踐。本指南涵蓋增強 3D 項目的技術、技巧和實際示例。 添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09; 強烈建議使用 GLTF 格式來集成 3D 幾何體&#xff0c;提供簡化的流程&#xff0c;并固有地支持動畫、…

Redis知識點(1)

目錄 Redis Redis和MySQL的區別 Redis的高可用方案 Redis可以用來做什么 Redis的數據類型 字符串 列表 哈希 集合 有序集合 Bitmap Redis為什么快呢&#xff1f; I/O多路復用 說說select,poll,epoll,kqueue,IOCP的區別 Redis為什么早期選擇單線程&#xff1f; …

使用iptables封禁惡意ip異常請求

查看后端日志發現一IP&#xff08;103.76.250.29&#xff09;頻繁請求不存在的資源路徑??&#xff08;如 /api/v1/guest/comm/config、/theme/default/assets/compoments.js 等&#xff09;&#xff0c;并伴隨對根路徑 / 的正常訪問。這種行為的可能性包括惡意掃描、自動化工…

BehaviorTree.Ros2 編譯教程

1. 源碼下載 git clone https://github.com/BehaviorTree/BehaviorTree.ROS2.git2. 編譯過程 源碼中有3個項目: btcpp_ros2_interfacesbtcpp_ros2_interfacesbtcpp_ros2_samples 2.1 編譯btcpp_ros2_interfaces: colcon --packages-select btcpp_ros2_interfaces2.2 編譯 …

AR智能巡檢系統:制造業設備管理的效率革新

隨著工業4.0和數字化轉型的加速&#xff0c;設備管理在制造業、能源、交通等關鍵領域的重要性愈發凸顯。傳統設備巡檢依賴人工記錄和紙質報告&#xff0c;不僅效率低下&#xff0c;還容易因人為疏忽導致數據錯誤或安全隱患。然而&#xff0c;增強現實&#xff08;AR www.teamhe…

破解海外倉客戶響應難題:自動化系統是關鍵

在跨境電商蓬勃發展的當下&#xff0c;海外倉作為連接賣家與終端消費者的重要樞紐&#xff0c;其服務效率直接影響著賣家的運營成果。其中&#xff0c;即時客戶響應一直是行業痛點&#xff0c;尤其對中小型海外倉而言&#xff0c;單純依靠人力維持全天候服務意味著高昂的成本壓…

PyTorch基礎——張量計算

文章目錄PyTorch基礎——張量計算1 什么是張量計算&#xff1f;2 基本算術運算2.1 加法運算2.1.2 torch.add2.1.3 a.add(b) 與 a.add_(b)a.add(b) 方法a.add_(b) 方法核心區別2.2 減法運算2.2.1 toch.sub()2.2.2 a.sub(b) 和a.sub_(b)a.sub(b) 方法a.sub_(b) 方法核心區別使用建…

云原生聯調利器:Telepresence實戰

Telepresence在云原生聯調中的應用&#xff1a;本地服務直連K8s集群實戰在云原生開發中&#xff0c;調試和測試服務常常需要本地環境與遠程Kubernetes&#xff08;K8s&#xff09;集群無縫集成。Telepresence是一個開源工具&#xff0c;它允許開發者將本地服務“注入”到K8s集群…

瀏覽器【詳解】requestIdleCallback(瀏覽器空閑時執行)

簡介requestIdleCallback 是瀏覽器的一個 API&#xff0c;用于在瀏覽器空閑時間執行低優先級任務&#xff0c;避免阻塞主線程&#xff0c;提升頁面性能和響應速度。 當瀏覽器完成了關鍵任務&#xff08;如渲染、布局、用戶交互處理&#xff09;且暫時沒有更高優先級的工作時&am…

STP技術

一、環路的危害1.現象鏈路指示燈快速閃爍MAC表震蕩&#xff1a;交換機頻繁修改MAC地址表 → 轉發失效。2.環路危害造成的影響鏈路堵塞主機操作系統響應遲緩二層交換機管理緩慢沖擊網關設備的CPU三、STP的作用1.STP基本原理STP即生成樹協議&#xff0c;它通過阻斷冗余鏈路來消除…

RAGFLOW~knowledge graph

start 為了增強多跳問答&#xff0c;RAGFlow在數據提取和索引之間增加了一個知識圖譜構建步驟&#xff0c;如下面所示。這一步驟會從您指定的分塊方法生成的現有塊中創建額外的塊。 從v0.16.0版本開始&#xff0c;RAGFlow支持在知識庫上構建知識圖譜&#xff0c;允許你在知識庫…