C++函數重載與引用詳解

一、函數重載:同名函數的 “差異化生存”?

1. 概念定義?

函數重載(Function Overloading)是 C++ 的重要特性,指在同一作用域內,允許存在多個同名函數,但要求這些函數的參數列表必須不同。

(參數個數、參數類型、參數順序至少有一項不同)非常重要!!

編譯器會根據調用時傳入的實參,自動匹配到對應的函數,實現 “一個函數名,多種功能” 的效果。?

2. 典型案例分析?

案例 1:參數個數不同的重載?

#include <iostream>
using namespace std;// 無參數版本
void print() {cout << "無參數調用" << endl;
}// 1個int參數版本
void print(int a) {cout << "int參數:" << a << endl;
}// 2個int參數版本
void print(int a, int b) {cout << "兩個int參數:" << a << " " << b << endl;
}int main() {print();          // 匹配無參數版本print(10);        // 匹配1個int參數版本print(20, 30);    // 匹配2個int參數版本return 0;
}

?輸出結果:?

無參數調用
int參數:10
兩個int參數:20 30

案例 2:參數類型不同的重載?

?

#include <iostream>
using namespace std;// int類型參數
int add(int a, int b) {return a + b;
}// double類型參數
double add(double a, double b) {return a + b;
}int main() {cout << "int加法:" << add(3, 5) << endl;       // 匹配int版本,輸出8cout << "double加法:" << add(2.5, 4.5) << endl; // 匹配double版本,輸出7.0return 0;
}

注意:僅返回值類型不同的函數,不能構成重載。例如int add(int a)和double add(int a),編譯器無法通過調用語句(如add(10))區分,會報 “重定義” 錯誤。?

案例 3:參數順序不同的重載?

#include <iostream>?#include <string>?using namespace std;??// 先int后string?void showInfo(int age, string name) {?cout << "年齡:" << age << ",姓名:" << name << endl;?}??// 先string后int?void showInfo(string name, int age) {?cout << "姓名:" << name << ",年齡:" << age << endl;?}??int main() {?showInfo(20, "張三"); // 匹配先int后string版本?showInfo("李四", 22); // 匹配先string后int版本?return 0;?}??

輸出結果:?

?

年齡:20,姓名:張三?姓名:李四,年齡:22??

案例 4:多文件分離(聲明與定義分離)?

實際項目中,函數重載常涉及多文件拆分,需注意 “聲明與定義的一致性”。?

#ifndef FUNC_H
#define FUNC_H  // 防止頭文件重復包含// 聲明3個重載函數
void calculate(int a);
void calculate(double a);
void calculate(int a, double b);#endif
#include "func.h"
#include <iostream>
using namespace std;void calculate(int a) {cout << "int參數計算:" << a * 2 << endl;
}void calculate(double a) {cout << "double參數計算:" << a * 3 << endl;
}void calculate(int a, double b) {cout << "int+double參數計算:" << a + b << endl;
}

#include "func.h"
int main() {calculate(5);        // 匹配int版本,輸出10calculate(3.5);      // 匹配double版本,輸出10.5calculate(2, 4.8);   // 匹配int+double版本,輸出6.8return 0;
}

編譯運行:需將三個文件一起編譯(如g++ main.cpp func.cpp -o test),確保聲明的重載函數在定義文件中都有對應的實現,否則會報 “未定義引用” 錯誤。?

3. 原理:為什么 C++ 支持,C 語言不支持??

核心原因在于編譯器對函數名的 “修飾規則” 不同:?

  • C 語言:編譯器會直接使用函數原名作為最終的 “符號名”(如函數add(int a, int b),符號名就是add)。若存在同名函數,符號名重復,鏈接階段會報錯,因此 C 語言不支持函數重載。?
  • C++ 語言:編譯器會根據函數的參數列表對函數名進行 “修飾”(也稱 “命名粉碎”,Name Mangling),生成唯一的符號名。例如:?
  • add(int a, int b)可能被修飾為_Z3addii(3表示函數名長度,ii表示兩個 int 參數);?
  • add(double a, double b)可能被修飾為_Z3adddd。?

不同重載函數的修飾后符號名不同,編譯器和鏈接器能準確識別,因此 C++ 支持函數重載。?

4.引用:變量的 “別名” 與權限控制?

1. 概念定義?

引用(Reference)是 C++ 引入的新特性,本質是變量的別名,它與原變量共享同一塊內存空間,對引用的操作等同于對原變量的操作。語法格式為:類型& 引用名 = 原變量;。?

注意:引用必須在定義時初始化,且初始化后不能再指向其他變量(與指針的核心區別)。?

2. 基礎操作:定義與使用?

?

#include <iostream>?using namespace std;??int main() {?int a = 10;?int& ref_a = a; // 定義引用ref_a,作為a的別名??cout << "a的值:" << a << endl; // 輸出10?cout << "ref_a的值:" << ref_a << endl; // 輸出10(與a共享內存)??ref_a = 20; // 操作引用,等同于修改a?cout << "修改后a的值:" << a << endl; // 輸出20??cout << "a的地址:" << &a << endl; // 輸出a的地址(如0x7ffeefbff4ac)?cout << "ref_a的地址:" << &ref_a << endl; // 輸出相同地址(證明共享內存)?return 0;?}??

3. 權限控制:放大、縮小與平移?

引用的權限遵循 “不能放大原變量的權限” 原則,否則編譯器會報錯;權限縮小或平移是允許的。以下是典型案例:?

案例 1:權限平移(同權限引用)?

原變量是普通變量,引用也為普通引用,權限一致,合法。?

?

int a = 10;?int& ref_a = a; // 合法:普通變量→普通引用,權限平移?

?

案例 2:權限縮小(原變量權限 > 引用權限)?

原變量是普通變量(可讀可寫),引用為const引用(只讀),權限縮小,合法。?

?

int a = 10;?const int& ref_a = a; // 合法:普通變量→const引用,權限縮小??ref_a = 20; // 錯誤:const引用只讀,不能修改?a = 20; // 正確:原變量是普通變量,可修改(修改后ref_a的值也會變)??

案例 3:權限放大(原變量權限 < 引用權限)?

原變量是const變量(只讀),引用為普通引用(可讀可寫),權限放大,非法。?

?

const int a = 10; // a是const變量,只讀?int& ref_a = a; // 錯誤:const變量→普通引用,權限放大,編譯器報錯??

案例 4:臨時變量的引用(易混淆點)?

臨時變量(如表達式結果、字面量)的權限是 “只讀”,只能用const引用接收,否則會觸發權限放大錯誤。?

?// 錯誤案例:臨時變量→普通引用(權限放大)?int& ref1 = 10; // 錯誤:10是臨時變量,只讀,普通引用無法接收?int& ref2 = 3 + 5; // 錯誤:3+5的結果是臨時變量,只讀??// 正確案例:臨時變量→const引用(權限縮小)?const int& ref3 = 10; // 合法:const引用可接收臨時變量?const int& ref4 = 3 + 5; // 合法:臨時變量值為8,ref4指向該臨時變量??

易錯點總結?

  1. 引用未初始化:定義引用時必須綁定原變量,否則報錯。?

錯誤:int& ref;(編譯器提示 “引用必須初始化”)。?

  1. 引用指向臨時變量未加 const:如上述案例 4,臨時變量只能用const引用接收,普通引用會觸發權限放大錯誤。?
  1. 混淆引用與指針:引用初始化后不能改指向,指針可以改指向;引用不需要解引用(*),指針需要。?

錯誤:int a=10, b=20; int& ref=a; ref=&b;(試圖讓引用指向 b,編譯器報錯)。?

  1. 數組引用的語法錯誤:數組引用需指定數組大小,語法格式為類型 (&引用名)[數組大小] = 原數組;。?

錯誤:int arr[5] = {1,2,3,4,5}; int& ref_arr = arr;(未指定數組大小);?

正確:int (&ref_arr)[5] = arr;。?

總結?

  1. 函數重載:C++ 通過 “參數列表不同” 實現同名函數的重載,核心原理是編譯器對函數名的 “修飾規則”(根據參數列表生成唯一符號名),而 C 語言因無此修飾,不支持重載。?
  1. 引用:本質是變量的別名,需初始化且不可改指向;權限控制遵循 “不能放大” 原則,臨時變量需用const引用接收,避免權限相關錯誤。

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

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

相關文章

2025-08-17 李沐深度學習16——目標檢測

文章目錄1 介紹1.1 實際應用1.2 邊界框1.3 數據集2 錨框2.1 什么是錨框2.2 交并比2.3 分配標簽2.4 非極大值抑制3 經典目標檢測網絡3.1 R-CNN3.1.1 R-CNN (原始版本)3.1.2 Fast R-CNN3.1.3 Faster R-CNN3.1.4 Mask R-CNN3.2 單階段檢測器&#xff1a;SSD 和 YOLO3.2.1 SSD (Sin…

Bluedroid vs NimBLE

&#x1f539; 對比&#xff1a;Bluedroid vs NimBLE 1. 協議棧體積 & 內存占用 Bluedroid&#xff1a;體積大&#xff0c;RAM 占用也大&#xff08;幾十 KB 到上百 KB&#xff09;。NimBLE&#xff1a;輕量級&#xff0c;內存占用大概是 Bluedroid 的一半甚至更少。 &…

(純新手教學)計算機視覺(opencv)實戰八——四種邊緣檢測詳解:Sobel、Scharr、Laplacian、Canny

邊緣檢測詳解&#xff1a;Sobel、Scharr、Laplacian、Canny邊緣檢測是圖像處理和計算機視覺中的重要步驟&#xff0c;主要用于發現圖像中亮度變化劇烈的區域&#xff0c;即物體的輪廓、邊界或紋理特征。OpenCV 提供了多種常用的邊緣檢測算子&#xff0c;本教程將通過四種方法帶…

PyTorch 環境配置

目錄一、安裝 CUDA二、安裝 PyTorch1. 創建虛擬環境2. 安裝 PyTorch三、在 PyCharm 上創建一個 PyTorch 項目參考文章&#xff1a; 【2025年最新PyTorch環境配置保姆級教程&#xff08;附安裝包&#xff09;】 【超詳細 CUDA 安裝與卸載教程&#xff08;圖文教程&#xff09;】…

鴻蒙中冷啟動分析:Launch分析

啟動的分類&#xff08;熱身環節&#xff09; 啟動動類型觸發條件系統開銷 & 速度主要優化方向冷啟動應用進程不存在&#xff08;首次啟動或進程被殺后啟動&#xff09;最高&#xff0c;需創建進程、加載資源、初始化所有組件主要優化目標&#xff0c;減少主線程任務&…

告別盲目排查,PolarDB+DAS Agent智能運維新突破

1.概述 周五下午6點正準備下班&#xff0c;數據庫CPU突然爆滿&#xff0c;業務告警響成一片&#xff0c;DBA卻要手動翻查CPU/內存/負載等多個監控指標&#xff0c;還要查詢是否有新增慢SQL&#xff0c;死鎖等問題&#xff1f;” 這可能是數據庫DBA最鬧心的場景了&#xff0c;…

Linux------《零基礎到聯網:CentOS 7 在 VMware Workstation 中的全流程安裝與 NAT 網絡配置實戰》

&#xff08;一&#xff09;Linux的發行版Centos安裝與配置 下載Linux發行版本Centos:centos-7-isos-x86_64安裝包下載_開源鏡像站-阿里云點擊CentOS-7-x86_64-DVD-2009.torrent &#xff0c;CentOS-7-x86_64-DVD-2009.torrent是官方提供的 BT 種子文件&#xff08;176.1 KB&a…

iOS App 混淆工具實戰,教育培訓類 App 的安全保護方案

隨著在線教育、企業培訓、知識付費平臺的興起&#xff0c;越來越多的 iOS 應用需要保護自己的課程資源和核心邏輯。然而&#xff0c;教育類 App 面臨的最大風險并非傳統的外掛或刷分&#xff0c;而是 視頻盜鏈、題庫數據泄露、源碼邏輯被二次利用。 在這種場景下&#xff0c;合…

RabbitMQ:SpringAMQP Topic Exchange(主題交換機)

目錄一、案例需求二、基礎配置三、代碼實現TopicExchange與DirectExchange類似&#xff0c;區別在于RoutingKey可以是多個單次的列表&#xff0c;并且以.分割。 Queue與Exchange指定BindingKey時可以使用通配符&#xff1a; #&#xff1a;代指0個或多個單詞。*&#xff1a;代…

(純新手教學)計算機視覺(opencv)實戰六——圖像形態學(腐蝕、膨脹、開運算、閉運算、梯度、頂帽、黑帽)

圖像形態學在圖像處理中&#xff0c;形態學&#xff08;Morphology&#xff09; 是一種基于圖像中物體形狀的處理方法&#xff0c;通常用于二值圖像和灰度圖像。它通過腐蝕、膨脹等基本操作&#xff0c;結合開運算、閉運算、梯度運算、頂帽、黑帽等派生操作&#xff0c;來實現去…

學習嵌入式第三十五天

文章目錄網絡&#xff08;續上&#xff09;1.函數接口2.相關功能實現1.TCP連接2.UDP習題網絡&#xff08;續上&#xff09; 1.函數接口 sendto 原型&#xff1a;ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, sockle…

為什么給數據表加了索引,寫入速度反而變慢了

為數據表增加索引后之所以會導致寫入&#xff08;包括插入、更新、刪除&#xff09;操作的速度變慢&#xff0c;其根本原因在于索引本質上是一個獨立的、需要與主表數據保持實時同步的“數據結構”。這一機制的核心邏輯涵蓋五個方面&#xff1a;因為索引本質上是一個“獨立的數…

.NET Core 中采用獨立數據庫的SAAS(多租戶)方法

介紹多租戶是指一種軟件架構&#xff0c;其中軟件的單個實例在服務器上運行并為多個租戶提供服務。在基于 SAAS 的平臺中&#xff0c;租戶是指使用該平臺開展業務運營的客戶。每個租戶都擁有獨立的數據、用戶帳戶和配置設置&#xff0c;并且與其他租戶隔離。多租戶允許有效利用…

運維日常工作100條

這是一份非常詳細和實用的“運維日常工作100條”清單。它涵蓋了從日常巡檢、變更管理、故障處理到安全、優化和文檔等運維工作的方方面面,可以作為運維工程師的日常工作指南和檢查清單。 運維日常工作100條 一、日常巡檢與監控 (20條) 檢查核心監控大盤:查看整體業務健康狀態…

OpenHarmony子系統介紹

OpenHarmony子系統OpenHarmony子系統1. AI業務子系統2. 方舟運行時子系統3. ArkUI框架子系統4. DFX子系統5. DeviceProfile子系統6. XTS子系統7. 上傳下載子系統8. 主題框架子系統9. 事件通知子系統10. 位置服務子系統11. 元能力子系統12. 全局資源調度子系統13. 全球化子系統1…

博士招生 | 英國謝菲爾德大學 招收計算機博士

內容源自“圖靈學術博研社”gongzhonghao學校簡介謝菲爾德大學&#xff08;The University of Sheffield&#xff09;是英國久負盛名的公立研究型大學&#xff0c;也是羅素集團成員之一。在 2026 年 QS 世界大學排名中&#xff0c;謝菲爾德大學位列第92位&#xff0c;其中計算機…

如何理解面向過程和面向對象,舉例說明一下?

面向過程和面向對象是兩種不同的編程思想&#xff0c;核心區別在于解決問題的視角不同&#xff1a;前者關注 “步驟和過程”&#xff0c;后者關注 “對象和交互”。面向過程的核心思想是把問題拆解成一系列步驟&#xff0c;通過函數實現每個步驟&#xff0c;然后按順序調用這些…

深入了解評估與微調中使用的Graders:原理、實現與最佳實踐

深入了解評估與微調中使用的Graders 在模型評估與微調&#xff08;Fine-tuning&#xff09;過程中&#xff0c;Graders&#xff08;評分器&#xff09;是衡量模型輸出與參考答案之間表現的重要工具。本文將系統介紹Grader的類型、技術實現及如何在實際項目中融入穩定且高質量的…

行緩存(line buffer)在圖像卷積中的工作方式

上面這張圖配合文字&#xff0c;展示了行緩存&#xff08;line buffer&#xff09;在圖像卷積中的工作方式&#xff1a;上半部分是一個按行掃描輸入的圖像塊&#xff08;示例為 99&#xff0c;編號 1–81&#xff09;。 藍色表示已被寫入行緩存并按隊列等待的數據&#xff0c;綠…

【數據分享】中國371個城市的坡度矢量數據和excel數據

今天要說明數據就是中國371個城市的坡度矢量數據和excel數據。數據介紹在城市發展的進程中&#xff0c;地形地貌始終是影響規劃決策的關鍵因素&#xff0c;而坡度作為表征地表傾斜程度的核心指標&#xff0c;更是貫穿于城市建設、生態保護等諸多環節。本文將全面解讀中國 371 個…