C++編程學習筆記:函數相關特性、引用與編譯流程

目錄

一、函數的缺省參數

(一)全缺省參數

(二)半缺省參數

二、函數重載

(一)參數類型不同

(二)參數個數不同

(三)參數類型順序不同

三、引用相關問題

(一)引用的基本概念與初始化

(二)引用在函數中的應用 - 以Swap函數為例

1.?普通變量交換(值傳遞方式存在問題)

2.?使用指針引用實現交換

3.?使用普通引用實現交換(更簡潔常用)

四、C++編譯流程

(一)預處理

(二)編譯

(三)匯編

(四)鏈接


在深入學習C++編程的過程中,函數特性、引用機制以及編譯流程都是極為關鍵的知識點。通過學習,我對這些內容有了更為透徹的理解,在此進行詳細梳理與記錄。

?

一、函數的缺省參數

(一)全缺省參數

全缺省參數意味著函數的所有參數都具備默認值。以下是示例代碼:

cppvoid Func(int a = 10, int b = 20, int c = 30){cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;}

當調用此函數時,若不傳入參數,函數會自動采用默認值。比如執行?Func()? ,將輸出?a = 10? 、?b = 20? 、?c = 30? 。這一特性在很多場景下能為函數調用提供便利,減少重復的參數輸入。

(二)半缺省參數

半缺省參數是指函數部分參數擁有默認值。代碼示例如下:

cppvoid Func(int a, int b = 10, int c = 20){cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;}

需要特別注意的是,半缺省參數必須遵循從右至左的順序依次給出,不能出現間隔的情況。并且,缺省參數不能在函數聲明和定義中同時存在。這是C++語法的嚴格規定,違背此規則會導致編譯錯誤。

二、函數重載

函數重載允許在同一作用域內,存在多個同名但參數列表(參數類型、個數、順序)不同的函數。以下是具體示例:

(一)參數類型不同

cppint Add(int left, int right){cout << "int Add(int left, int right)" << endl;return left + right;}double Add(double left, double right){cout << "double Add(double left, double right)" << endl;return left + right;}

上述代碼中,兩個?Add?函數雖然名字相同,但一個處理?int?類型參數,一個處理?double?類型參數,構成了函數重載。

(二)參數個數不同


?

cppvoid f(){cout << "f()" << endl;}void f(int a){cout << "f(int a)" << endl;}

這里兩個?f?函數,一個無參數,一個帶有?int?類型參數,體現了因參數個數不同而形成的函數重載。

(三)參數類型順序不同


?

cppvoid f(int a, char b){cout << "f(int a,char b)" << endl;}void f(char b, int a){cout << "f(char b,int a)" << endl;}

這兩個?f?函數參數類型相同,但順序不同,同樣構成函數重載。

然而,函數重載也可能引發調用歧義問題。例如:


?

cppvoid f(){cout << "f()" << endl;}void f(int a = 0){cout << "f(int a)" << endl;}int main(){f(); // 此處調用會出現歧義,編譯器無法確定調用哪個函數return 0;}

在此情形下,編譯器難以抉擇要調用哪個?f?函數,從而報錯。這就要求我們在使用函數重載時,要謹慎考慮,避免出現這種不明確的調用情況。

三、引用相關問題

(一)引用的基本概念與初始化

在C++中,引用實際上是給變量取的一個別名。示例如下:

cppint a = 0;int& b = a;int& c = b;

這里?b?和?c?均為?a?的引用。需要著重強調的是,引用在定義時必須進行初始化。像?int& d;?這種未初始化的引用是不符合語法規則的,編譯器會報錯,提示如?C2530 “d”: 必須初始化引用? 。這是因為引用本質上是變量的別名,必須在定義時明確其關聯的變量。

(二)引用在函數中的應用 - 以Swap函數為例

1.?普通變量交換(值傳遞方式存在問題)

最初嘗試實現交換兩個整數變量值的函數時,若采用值傳遞方式,代碼如下:

cppvoid Swap(int a, int b){int tmp = a;a = b;b = tmp;}int main(){int x = 0, y = 1;Swap(x, y);cout << x << " " << y << endl; // 輸出結果仍為0 1,未實現交換return 0;}

這種方式無法真正實現變量值的交換,原因在于函數內交換的只是形參?a?和?b?的值,而實參?x?和?y?并未受到影響,因為形參是實參的副本,函數結束后副本的改變不會反饋到實參上。

2.?使用指針引用實現交換

為解決上述問題,可使用指針引用的方式,代碼如下:


?

cppvoid Swap(int*& a, int*& b){int* tmp = a;a = b;b = tmp;}int main(){int x = 0, y = 1;int* px = &x, * py = &y;cout << px << " " << py << endl;Swap(px, py);cout << px << " " << py << endl;return 0;}

這里函數參數是指針的引用,通過這種方式可以直接操作指針本身,實現指針所指向變量地址的交換。

3.?使用普通引用實現交換(更簡潔常用)

更為簡潔常用的方式是使用普通引用,代碼如下:


?

cppvoid Swap(int& a, int& b){int tmp = a;a = b;b = tmp;}int main(){int x = 0, y = 1;Swap(x, y);cout << x << " " << y << endl; // 輸出1 0,成功實現交換return 0;}

在這個版本中,?Swap?函數接收的是變量的引用,函數內部對形參的操作等同于對實參的操作,從而順利實現了兩個整數變量值的交換。

四、C++編譯流程

(一)預處理

預處理階段承擔著多項重要任務,包括頭文件展開、宏替換、條件編譯以及去掉注釋等操作。假設有?Stack.h? 、?Stack.cpp? 、?Test.cpp?等文件,經過預處理后,會生成?Stack.i?和?Test.i?。這一階段為后續的編譯工作做了前期的準備,將代碼整理成更便于編譯器處理的形式。

(二)編譯

編譯階段主要是對代碼進行語法檢查,并生成匯編代碼。在此過程中,會生成?Stack.s?和?Test.s?文件。如果代碼中存在語法錯誤,就會在這個階段被編譯器檢測出來并報錯。語法檢查涵蓋了對變量聲明、語句結構、函數調用等多方面的規則校驗,只有通過語法檢查的代碼才能順利進入后續階段。

(三)匯編

匯編階段的任務是將匯編代碼轉換成二進制機器碼,生成?Stack.o?和?Test.o?目標文件。這是將高級語言逐步轉化為機器能夠直接執行的指令的關鍵步驟,二進制機器碼是計算機硬件能夠直接理解和執行的指令形式。

(四)鏈接

鏈接階段會把各個目標文件以及所依賴的庫文件等進行鏈接,最終生成可執行程序(如?xxx.exe?或?a.out?)。在鏈接過程中,會處理函數的聲明和定義之間的關聯,找到函數的具體實現位置。例如,在多個源文件中調用的函數,鏈接器會確保函數的聲明和定義能夠正確匹配,使得程序在運行時能夠準確找到并執行相應的函數代碼。

理解C++編程中的這些關鍵知識點,無論是函數特性、引用機制還是編譯流程,對于編寫高質量、無錯誤的代碼至關重要。在實際編程過程中,不僅要牢記這些理論知識,更要通過大量的實踐來加深理解和掌握,在遇到編譯錯誤和運行時問題時,能夠依據這些知識快速定位和解決問題,不斷提升自己的編程能力。

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

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

相關文章

RPCGC閱讀

24年的MM 創新 現有點云壓縮工作主要集中在保真度優化上。 而在實際應用中&#xff0c;壓縮的目的是促進機器分析。例如&#xff0c;在自動駕駛中&#xff0c;有損壓縮會顯著丟失戶外場景的詳細信息。在三維重建中&#xff0c;壓縮過程也會導致場景數據中語義信息(Contour)的…

泛目錄優化:無極泛目錄優化網站,技術解析與風險控制指南

無極泛目錄優化網站精簡版 一、核心功能 無限層級目錄&#xff1a;支持動態創建 5 級以上子目錄&#xff0c;形成內容矩陣AI 內容生成&#xff1a;集成 GPT-4 接口&#xff0c;日均生產 10 萬 原創度 70% 以上的頁面SEO 智能檢測&#xff1a;自動優化 TDK、URL 結構、圖片屬…

歸檔重做日志archived log (明顯) 比redo log重做日志文件小

歸檔重做日志 (明顯) 比重做日志文件小。 (文檔 ID 1356604.1) 日志切換將由于以下原因發生&#xff1a; 1. 由于在重做日志文件已滿之前強制創建存檔而記錄和設計的行為 SQL> alter system switch logfile;SQL> alter system archive log current;RMAN> backup ar…

645.錯誤的集合

import java.util.HashMap; import java.util.Map;/*** program: Test* description: 645 錯誤的集合* author: gyf* create: 2025-03-23 10:22**/ public class Test {public static void main(String[] args) {}public static int[] findErrorNums(int[] nums) {int[] arr n…

力扣刷題494. 目標和

494. 目標和 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff0c;暴力dfs 直接進行深搜查找出所有的情況&#xff0c;缺點嚴重超時&#xff0c;只能過20個案例 留一下超時的 class Solution {//首先定義全局變量int[] abs { 1, -1 }; //用來記錄當前遍歷的數的正…

一周學會Flask3 Python Web開發-SQLAlchemy數據遷移migrate

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程&#xff1a; 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 模型類(表)不是一成不變的&#xff0c;當你添加了新的模型類&#xff0c;或是在模型類中添加了新的字段&#xff0c;甚至是修改…

Python練習之抽獎界面

前言 一、代碼整體架構分析 1、數據層 (Model) 2、控制層 (Controller) 3、視圖層 (View) 二、核心功能實現詳解 1、 文件導入功能 1.1、實現邏輯 1.2、代碼涉及知識點講解 1.2.1、wildcard 1.2.2、wx.FileDialog 1.2.3、dlg.ShowModal() 2、抽獎動畫控制 1.1、…

【云原生】docker 搭建單機PostgreSQL操作詳解

目錄 一、前言 二、前置準備 2.1 服務器環境 2.2 docker環境 三、docker安裝PostgreSQL過程 3.1 獲取PostgreSQL鏡像 3.2 啟動容器 3.2.1 創建數據卷目錄 3.2.2 啟動pg容器 3.3 客戶端測試連接數據庫 四、創建數據庫與授權 4.1 進入PG容器 4.2 PG常用操作命令 4.2…

算法為舟 思想為楫:AI時代,創作何為?

在科技浪潮洶涌澎湃的當下,AI技術以前所未有的態勢席卷各個領域,創作領域亦未能幸免。當生成式AI展現出在劇本撰寫、詩歌創作、圖像設計等方面的驚人能力時,人類創作者仿佛置身于文明演化的十字路口,迷茫與困惑交織,興奮與擔憂并存。在AI時代,創作究竟該何去何從?這不僅…

JAVA的內存圖理解

目錄 一、方法區1、類常量池2、靜態常量池3、方法區過程 二、棧三、堆1、字符常量池2、堆內存圖的繪制 java中內存可以分為 方法區、 堆、 棧、 程序計數器、 本地方法棧&#xff0c;其中比較中重要的是方法區、堆、棧。 一、方法區 1.方法區&#xff08;Method Area&…

基于Selenium的IEEE Xplore論文數據爬取實戰指南

基于Selenium的IEEE Xplore論文數據爬取實戰指南 一、項目背景與目標 IEEE Xplore作為全球知名的學術資源平臺,收錄了大量高質量科技文獻。本教程將演示如何通過Python的Selenium庫實現: 自動化獲取指定領域論文列表(以"構音障礙"為例)完整提取論文標題、摘要、…

軟件工程面試題(十二)

1、文件和目錄(i/o)操作,怎么列出某目錄下所有文件?某目錄下所有子目錄,怎么判斷文件或目錄是否存在?如何讀寫文件? 列出某目錄下所有文件:調用listFile(),然后判斷每個File對象是否是文件可以調用 isFile(),判斷是否是文件夾可以調用isDirectory(),判斷文件或目…

醫療CMS高效管理:簡化更新維護流程

內容概要 醫療行業內容管理系統&#xff08;CMS&#xff09;的核心價值在于應對醫療信息管理的多維復雜性。面對診療指南的動態更新、科研數據的快速迭代以及多機構協作需求&#xff0c;傳統管理模式往往面臨效率瓶頸與合規風險。現代化醫療CMS通過構建結構化權限管理矩陣&…

談談Minor GC、Major GC和Full GC

目錄 一、背景 二、三者之間的區分 1、Minor GC 2、Major GC &#xff08;1&#xff09;老年代空間不足&#xff1a; &#xff08;2&#xff09;晉升&#xff08;Promotion&#xff09;失敗&#xff1a; &#xff08;3&#xff09;空間分配擔保失敗&#xff1a; &#x…

C盤清理技巧分享:PE Dism++ 空間清理篇

C盤清理技巧分享&#xff1a;PE & Dism 空間清理篇 C盤空間不足是許多用戶面臨的常見問題&#xff0c;尤其是在使用 Windows 系統時。本文將重點介紹如何使用 PE&#xff08;Preinstallation Environment&#xff09;和 Dism 工具高效清理 C盤空間&#xff0c;釋放寶貴的存…

低功耗LPWAN模塊開發指南:遠距離無線通信與邊緣計算融合實戰?

在遠程資產追蹤、野外環境監測等場景中&#xff0c;穩定可靠的長距離通信與超低功耗是系統設計的核心挑戰。eFish-SBC-RK3576通過 ?原生雙UART接口 USB OTG擴展能力? &#xff0c;可無縫集成主流LPWAN模組&#xff08;LoRa/NB-IoT&#xff09;&#xff0c;實現“數據采集-邊…

迅為iTOP-RK3576人工智能開發板Android 系統接口功能測試

2.1 開機啟動 開發板接通電源&#xff0c;并按下電源開關&#xff0c;系統即啟動&#xff0c;在啟動過程中&#xff0c;系統會顯示下圖中的開機畫面&#xff0c;它們分別是 Android 系統啟動時的 Logo 畫面&#xff1a; 最后會顯示如下解鎖畫面&#xff1a; 2.2 命令終端 將…

RAG基建之PDF解析的“無OCR”魔法之旅

PDF文件轉換成其他格式常常是個大難題,大量的信息被鎖在PDF里,AI應用無法直接訪問。如果能把PDF文件或其對應的圖像轉換成結構化或半結構化的機器可讀格式,那就能大大緩解這個問題,同時也能顯著增強人工智能應用的知識庫。 嘿,各位AI探險家們!今天我們將踏上了一段奇妙的…

二層框架組合實驗

實驗要求&#xff1a; 1,內網IP地址使用172.16.0.0/16分配 2,SW1和sw2之間互為備份 3,VRRP/STP/VLAN/Eth-trunk均使用 4,所有PC均通過DHCP獲取IP地址 5,ISP只能配置IP地址 6,所有電腦可以正常訪問ISP路由器環回 實驗思路順序&#xff1a; 創建vlan eth-trunk 劃分v…

光纖耦合器

以下是關于光纖耦合器的詳細介紹&#xff1a; 定義與原理 - 定義&#xff1a;光纖耦合器是一種能使傳輸中的光信號在特殊結構的耦合區發生耦合&#xff0c;并進行再分配的器件&#xff0c;也叫分歧器、連接器、適配器、光纖法蘭盤。 - 原理&#xff1a;利用不同光纖面緊鄰光纖芯…