C++入門篇(下)

目錄

1、引用

1.1 引用概念

1.2 引用特性

1.3 常引用

1.4 使用場景

1.4.1 引用做參數

?1.4.2 引用做返回值

1.5?引用和指針的區別

2、內聯函數?

2.1 概念

2.2 特性

3、auto關鍵字?

4、基于范圍的for循環?

5、指針空值nullptr?

5.1 C++98 中的指針空值處理

5.2?C++11 中 nullptr 的優勢


? 本章節將延續上篇文章未講完的內容,期待接下來的內容哦!!!

1、引用

1.1 引用概念

類型& 引用變量名(對象名) = 引用實體;
void TestRef()
{int a = 10;int& ra = a;//<====定義引用類型printf("%p\n", &a);printf("%p\n", &ra);
}

? ? ?ra是a的別名,是一個變量,占用同一塊內存

? ? 注意: 引用類型 必須和引用 實體 同種類型
1.2 引用特性
? ? 1. 引用在 定義時必須初始化
? ? 2. 一個變量可以有多個引用
? ? 3. 引用一旦引用一個實體,再不能引用其他實體
1.3 常引用

? ? 只有引用才涉及權限的變化

1.4 使用場景
1.4.1 引用做參數

? ? 輸出型參數:形參的改變會改變實參

? ? 引用做參數不會開辟空間

?1.4.2 引用做返回值

? ? 引用做返回值不會創建臨時變量

1.5?引用和指針的區別

? ? 引用語法層面不開空間,底層實現和指針類似

面試常考點:

2、內聯函數?

2.1 概念
? ? 以 inline 修飾 的函數叫做內聯函數, 編譯時 C++ 編譯器會在 調用內聯函數的地方展開 ,沒有函數調用建立棧幀的開銷,內聯函數提升程序運行的效率。
? ? 如果在上述函數前增加inline關鍵字將其改成內聯函數,在編譯期間編譯器會用函數體替換函數的調用
查看方式:
1. release 模式下,查看編譯器生成的匯編代碼中是否存在 call Add
2. debug 模式下,需要對編譯器進行設置,否則不會展開 ( 因為 debug 模式下,編譯器默認不會對代碼進行優化,以下給出vs2022 的設置方式 )
2.2 特性
1. inline 是一種 以空間換時間 的做法,如果編譯器將函數當成內聯函數處理,在 編譯階段,會
用函數體替換函數調用 ,缺陷:可能會使目標文件變大,優勢:少了調用開銷,提高程序運
行效率。
2. inline 對于編譯器而言只是一個建議,不同編譯器關于 inline 實現機制可能不同 ,一般建
議:將 函數規模較小 ( 即函數不是很長,具體沒有準確的說法,取決于編譯器內部實現 )
是遞歸、且頻繁調用 的函數采用 inline 修飾,否則編譯器會忽略 inline特性。下圖為《 C++prime 》第五版關于 inline 的建議:
? ? ?問題: 為啥內聯函數可能會導致目標文件變大

3. inline 不建議聲明和定義分離,分離會導致鏈接錯誤。因為 inline 被展開,就沒有函數地址
了,鏈接就會找不到
// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{f(10);return 0;
}
// 鏈接錯誤:main.obj : error LNK2019: 無法解析的外部符號 "void __cdecl 
f(int)" (?f@@YAXH@Z),該符號在函數 _main 中被引用

內聯函數和宏函數
? ? 相似點:?
? ? 避免函數調用開銷:都能在一定程度上避免常規函數調用時的棧幀創建、參數傳遞等開銷,提高程序運行效率。
? ? 代碼替換:在編譯或預處理階段,都會將相關代碼替換到調用處。內聯函數由編譯器決定是否展開替換,宏函數是在預處理階段進行文本替換。?
? ? 優缺點
? ? 內聯函數:優點是有類型檢查和語法檢查,增強了程序的健壯性,且調試方便;缺點是編譯器對其展開有條件限制,當函數體復雜時可能不進行內聯,同時會使代碼體積增大。
? ? 宏函數:優點是簡單靈活,可定義復雜的表達式,在代碼生成方面有一定的優勢;缺點是沒有類型檢查,容易出現副作用,且在調試時難以定位問題,也可能導致代碼可讀性變差。

3、auto關鍵字?

? ? 使用 auto 定義變量時必須對其進行初始化,在編譯階段編譯器需要根據初始化表達式來推導 auto 的實際類型 。因此 auto 并非是一種 類型 的聲明,而是一個類型聲明時的 占位符 ,編譯器在編 譯期會將 auto 替換為變量實際的類型

4、基于范圍的for循環?

void TestFor1()
{int array[] = { 1, 2, 3, 4, 5 };//讓數組中的元素大小變成原來的二倍for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)array[i] *= 2;//打印數組元素for (int* p = array; p < array + sizeof(array) / sizeof(array[0]); ++p)cout << *p << endl;
}void TestFor2()
{int array[] = { 1, 2, 3, 4, 5 };//讓數組中的元素大小變成原來的二倍for (auto& e : array)e *= 2;//打印數組元素for (auto e : array)cout << e << " ";}int main()
{TestFor2();return 0;
}

5、指針空值nullptr?

5.1 C++98 中的指針空值處理

初始化方式
? ? 在 C/C++ 編程里,為避免未初始化指針帶來的錯誤,習慣給指針合適初值。在 C++98 中,當指針無合法指向時,常見初始化方式:

NULL的本質

NULL 本質是宏,在傳統 C 頭文件?stddef.h?中定義如下:

即 NULL 可能被定義為字面常量 0 ,或無類型指針?(void*)?的常量 。

使用 NULL 的麻煩

? ? 這里?f(0)?調用?f(int)?沒問題,但?f(NULL)?由于 NULL 定義的模糊性(既像 0 又像指針),可能導致編譯器匹配混亂,而?f((int*)NULL)?雖然明確轉化為指針類型調用?f(int*)?,但這種寫法不夠簡潔直觀 。

5.2?C++11 中 nullptr 的優勢

無需額外頭文件
? nullptr?是 C++11 引入的新關鍵字,專門表示指針空值 。使用它時,無需包含額外頭文件,代碼簡潔性提升。

字節數特性
? ? 在 C++11 中,sizeof(nullptr)?與?sizeof((void*)0)?所占字節數相同 。這意味著?nullptr?在內存占用等底層特性上,和傳統表示空指針的方式在字節層面有對應關系。

提升代碼健壯性
? ? 相比?NULL?可能帶來的歧義,nullptr?明確表示指針空值。在函數重載等場景下,能讓編譯器準確匹配函數,減少錯誤發生概率,使代碼更健壯。例如之前的?f?函數調用,使用?nullptr?就很明確:

? ? 總結來說,nullptr?作為 C++11 的新特性,解決了 C++98 中?NULL?表示指針空值的一些弊端,讓指針空值的表達更清晰、準確,有助于寫出更可靠的代碼

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

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

相關文章

Multi-Query Attention (MQA) PyTorch 實現

和多頭注意力機制的唯一區別&#xff1a;K、V在不同的head之間實現了復用&#xff0c;而對于不同的頭&#xff0c;Q依然不同。 因此這里的代碼和標準多頭注意力的實現也是幾乎完全一樣&#xff1a; import torch import torch.nn as nn import torch.nn.functional as Fclass…

visual studio無法跳轉到函數定義、變量定義、跳轉函數位置不準問題解決

參考&#xff1a;https://blog.csdn.net/snakehacker/article/details/135438353 程序有時會出現大部分函數都不能準確的從頭文件中正確定位到函數定位,這是因為數據庫錯亂造成的,可以通過重構數據庫來解決,操作方法如下&#xff1a; 菜單欄&#xff1a;工具——選項 文本編輯…

Java優雅實現判空方法

在 Java 開發中&#xff0c;頻繁的 if (obj ! null) 判空代碼會導致代碼冗余、可讀性差&#xff0c;且容易遺漏判空導致 NullPointerException。以下從 語言特性、設計模式、工具類 和 編碼規范 四個維度&#xff0c;結合實際案例&#xff0c;詳解如何優雅處理空值問題。 一、…

京東百億補貼殺入外賣市場:一場關乎即時零售未來的攻防戰

當美團和餓了么在外賣市場雙雄爭霸十余年之際&#xff0c;京東突然以"百億補貼免傭金"的組合拳高調入場。這場看似跨界的外賣大戰&#xff0c;實則是互聯網巨頭對萬億級即時零售市場的生死爭奪。 外賣只是表象&#xff0c;即時零售才是終極戰場 京東黑板報4月10日官…

UNION和UNION ALL的主要區別

UNION和UNION ALL的主要區別在于處理重復數據和排序的方式。 UNION和UNION ALL都是SQL語言中用于合并兩個或多個SELECT語句結果集的關鍵字。它們的主要區別如下&#xff1a; 1、對重復結果的處理&#xff1a;UNION在進行表鏈接后會篩選掉重復的記錄&#xff0c;而UNION ALL不會…

七段碼 路徑壓縮 并查集 dfs

12.七段碼 - 藍橋云課 將七個二極管映射為 1-7 開一個二維矩陣 為 相鄰的邊連上線 edge[1][2] edge[1][6] 1;edge[2][1] edge[2][3] edge[2][7] 1;edge[3][2] edge[3][4] edge[3][7] 1;edge[4][3] edge[4][5] 1;edge[5][4] edge[5][6] edge[5][7] 1;edge[6][1…

科技如何改變世界?

技術是我們日常生活中不可或缺的一部分&#xff0c;以至于我們常常忘記了它的重要性。如果你正在科技領域工作&#xff0c;或者希望進入該領域&#xff0c;你可能是眾多有使命感的人之一&#xff0c;希望知道自己的日常工作能為社會或地球的長遠利益做出貢獻。 別再四處尋找了…

抽象的https原理簡介

前言 小明和小美是一對好朋友&#xff0c;他們分隔兩地&#xff0c;平時經常寫信溝通&#xff0c;但是偶然被小明發現他回給小美的信好像被人拆開看過&#xff0c;甚至偷偷被篡改過。 對稱加密算法 開頭的通信過程比較像HTTP服務器與客戶端的通信過程&#xff0c;全明文傳輸…

高級java每日一道面試題-2025年4月13日-微服務篇[Nacos篇]-Nacos如何處理網絡分區情況下的服務可用性問題?

如果有遺漏,評論區告訴我進行補充 面試官: Nacos如何處理網絡分區情況下的服務可用性問題&#xff1f; 我回答: 在討論 Nacos 如何處理網絡分區情況下的服務可用性問題時&#xff0c;我們需要深入理解 CAP 理論以及 Nacos 在這方面的設計選擇。Nacos 允許用戶根據具體的應用…

python解壓文件 zip tar.gz tar.xz

以下代碼為解壓zip包 tar包文件 zip_path&#xff1a;文件絕對路徑 output_folder&#xff1a;文件解壓后存放的文件夾路徑 def extract_file(zip_path, output_folder):# 支持解壓zip tar tar.gz tar.xz .tar.bz2# 確保輸出文件夾存在os.makedirs(output_folder, exist_okT…

網絡基礎(協議,地址,OSI模型、Socket編程......)

目錄 一、計算機網絡發展 二、協議 1.認識協議 2.OSI七層模型 3.TCP/IP 五層(或四層)模型 4.協議本質 三、網絡傳輸流程 1.MAC地址 2.協議棧 3.IP地址 IP地址 vs MAC地址 1. 核心區別 2. 具體通信過程類比 3. 關鍵總結 為什么需要兩者&#xff1f; 4.協議棧圖解…

生成式AI對話中提示詞策略:明確問題、明確目標和提供背景信息是最有效的策略

生成式AI對話中提示詞策略:明確問題、明確目標和提供背景信息是最有效的策略 最有效的提示詞策略包括明確問題、明確目標和提供背景信息。普適性有效提示詞策略可分為三類:明確需求與精確指引型、清晰解釋與邏輯排序型、拆解任務與多樣化表達型。[局限]數據來源于中國用戶,…

AtCoder ABC402 ABCD

A - CBC 把大寫字母按順序連起來 B - Restaurant Queue 一眼隊列&#xff0c;stl模擬就行 C - Dislike Foods 顯然&#xff0c;每次克服暴力枚舉每個菜肴會超時。 然而題目中給了每個菜肴的配菜個數&#xff0c;不妨換過來統計每個配菜用在了哪些菜肴。每次克服時&#x…

Transformer 架構 - 解碼器 (Transformer Architecture - Decoder)

歡迎回到我們的 Transformer 系列教程!在上一篇中,我們詳細探討了 Transformer 的編碼器,它負責將輸入的源序列(比如源語言句子)轉換為一系列包含豐富上下文信息的向量表示。 現在,我們將把目光投向 Transformer 的另一半——解碼器 (Decoder)。解碼器負責接收編碼器的輸…

神經網絡與模型訓練過程筆記

1.專有名詞 ANN 人工神經網絡&#xff0c;一種受生物神經元啟發的監督學習算法。輸入數據通過網絡中的層級函數傳遞&#xff0c;激活特定神經元。函數復雜度越高&#xff0c;模型對數據的擬合能力越強&#xff0c;預測精度越高。 偏置項 其中x下表從1開始的是輸入變量&#xf…

【計算機網絡 | 第二篇】常見的通信協議(一)

HTTP和HTTPS有什么區別&#xff1f; 端口號&#xff1a;HTTP默認是80端口&#xff0c;HTTPS默認是443。 URL前綴&#xff1a;HTTPHTTP 的 URL 前綴是 http://&#xff0c;HTTPS 的 URL 前綴是 https://。 安全性和資源消耗&#xff1a;HTTP協議運行在TCP上&#xff0c;都是明…

【python實用小腳本系列】用 Python 自己手搓一個給視頻“靜音”的小腳本,批量處理,輕松高效制作“無聲電影”!

嘿&#xff0c;小伙伴們&#xff01;今天我來給大家介紹一個超實用的 Python 小工具——一個能給視頻“靜音”的“聲音消除器”&#xff01;是不是聽起來很酷&#xff1f;想象一下&#xff0c;你可以把任何有聲視頻變成無聲視頻&#xff0c;是不是很有趣&#xff1f;接下來&…

【gpt生成-總覽】怎樣才算開發了一門編程語言,需要通過什么測試

開發一門真正的編程語言需要經歷完整的設計、實現和驗證過程&#xff0c;并通過系統的測試體系驗證其完備性。以下是分階段開發標準及測試方法&#xff1a; 一、語言開發核心階段 1. 語言規范設計&#xff08;ISO/IEC 標準級別&#xff09; ??語法規范??&#xff1a;BNF/…

leetcode222 完全二叉樹的節點個數

完全二叉樹 的定義如下&#xff1a;在完全二叉樹中&#xff0c;除了最底層節點可能沒填滿外&#xff0c;其余每層節點數都達到最大值&#xff0c;并且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層&#xff08;從第 0 層開始&#xff09;&#xff0c;則該層…

若依集成BladeX單點登錄的令牌管理與api請求流程

目錄 概述系統架構單點登錄流程令牌管理機制接口調用流程關鍵代碼實現數據結構安全性考慮常見問題與解決 概述 本文檔詳細說明若依系統如何實現與BladeX的單點登錄集成&#xff0c;包括令牌管理和接口調用的完整流程。整個集成采用基于OAuth2的授權碼流程&#xff0c;允許用…