函數重載與函數模板

函數重載與函數模板

函數重載

函數組成

返回類型 函數名稱(參數列表){函數體}

函數簽名:函數名稱(參數列表)

C++ 允許定義同名函數,前提是它們具有不同的簽名。這被稱為函數重載 。

C++ 編譯器通過檢查調用中參數的數量、類型和順序來選擇要調用的適當函數。

//重載函數
//函數名稱一致,但參數列表中參數類型、順序不同
int square(int x){return x*x;
}
double square(double y){return y*y;
}

函數重載的目的:函數重載用于創建多個同名函數,這些函數執行類似任務,但處理不同類型的數據。

編譯器如何區分重載函數
重載函數通過其簽名來區分。簽名是函數名稱及其參數類型(按順序排列 )的組合。類型安全鏈接可確保調用恰當的函數,且實參的類型與形參的類型相符。為實現類型安全鏈接,編譯器會在內部對每個函數標識符進行編碼,編碼時納入其參數的類型 —— 這一過程稱為名稱修飾(name mangling )。這些編碼因編譯器而異,因此,要為特定平臺創建可執行文件而進行鏈接的所有內容,都必須使用該平臺對應的同一編譯器進行編譯。

下圖為由 GNU C++ 在匯編語言中生成的經過修飾的函數名稱 。

如果函數簽名一致,但返回類型不同,會造成編譯錯誤

創建具有相同參數列表但不同返回類型的重載函數會導致編譯錯誤。編譯器僅通過參數列表來區分重載函數,這些函數的參數數量不必相同。

如果一個函數省略了默認參數,可能會與另一個重載函數的調用形式完全相同,這也會引發編譯錯誤

例如,若存在一個顯式不接受任何參數的函數,以及另一個同名但包含所有默認參數的函數,那么當嘗試以不傳遞任何參數的方式調用該函數名時,就會導致編譯錯誤——編譯器無法明確確定應選擇哪個版本的函數。

函數模板

函數模板產生的背景
重載函數通常對不同數據類型執行類似的操作。如果對于每種數據類型,程序邏輯和操作都是相同的,那么使用函數模板可以更緊湊、便捷地實現重載。你只需編寫一個函數模板定義,C++ 會自動生成獨立的函數模板特化版本(也稱為模板實例化),以適配所提供參數類型的每種調用類型。因此,單個函數模板定義了一個重載函數家族。使用模板進行編程也稱為泛型編程

定義了一個最大值函數模板,該模板返回三個值中的最大值

所有函數模板定義均以template關鍵字開頭,后跟包含在尖括號(<>)中的模板參數列表。

模板參數列表中的每個參數都以關鍵字typename或keyword class作為前綴。

類型參數是基本類型或用戶定義類型的占位符。這些占位符(在本例中為T)用于指定函數參數的類型、函數的返回類型,以及在函數定義體中聲明變量。函數模板的定義方式與其他函數類似,但使用類型參數作為實際數據類型的占位符。

頭文件maximum.h

// template <關鍵字 占位符>
template <typename T>  // or template <class T>      
T maximum(T value1, T value2, T value3) {                 T maximumValue{value1}; // assume value1 is maximum    // determine whether value2 is greater than maximumValueif (value2 > maximumValue) {                           maximumValue = value2;                               }                                                        // determine whether value3 is greater than maximumValueif (value3 > maximumValue) {                           maximumValue = value3;                               }                                                        return maximumValue;                                    } 

main.cpp

 // Function template maximum test program.
#include <iostream>
#include "maximum.h" // include definition of function template maximum 
using namespace std;int main() {// demonstrate maximum with int valuescout << "Input three integer values: ";int int1, int2, int3;cin >> int1 >> int2 >> int3;// invoke int version of maximumcout << "The maximum integer value is: "<< maximum(int1, int2, int3);        // demonstrate maximum with double valuescout << "\n\nInput three double values: ";double double1, double2, double3;cin >> double1 >> double2 >> double3;// invoke double version of maximumcout << "The maximum double value is: "<< maximum(double1, double2, double3);// demonstrate maximum with char valuescout << "\n\nInput three characters: ";char char1, char2, char3;cin >> char1 >> char2 >> char3;// invoke char version of maximumcout << "The maximum character value is: "<< maximum(char1, char2, char3) << '\n';} 

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

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

相關文章

NLP學習路線圖(四十六):可解釋性

在自然語言處理(NLP)技術重塑人機交互、信息檢索甚至司法決策的今天,一個尖銳的問題愈發凸顯:當模型在文本分類中判定你的貸款申請被拒,或在簡歷篩選中將你排除,你是否有權追問一句——“為什么?” 一、黑箱迷霧:NLP模型的不透明困境 現代NLP的核心驅動力——深度神經…

uniapp的app項目,在華為pad上運行,頁面顯示異常

最開始為了好調試&#xff0c;運行成h5在瀏覽器調試的&#xff0c;調完以后&#xff0c;放到pad上。。。天塌了&#xff0c;所有頁面異常&#xff0c;感覺被放大了好多&#xff0c;而且頁面很亂。。。 查了很多資料&#xff0c;說把px改為rpx&#xff0c;好&#xff0c;全部改…

Linux中的連接符

Linux中的&&連接符 和其它語言類似&#xff0c;在Shell中&#xff0c;&&是一個邏輯運算符&#xff0c;表示邏輯AND&#xff0c;用于連接多個條件表達式 不同的是&#xff0c;在Linux系統中&#xff0c;&&不僅可以連接條件表達式&#xff0c;而且還能連…

裝飾模式Decorator Pattern

模式定義 動態地給對象增加額外的職責 對象結構型模式 模式結構 Component&#xff1a;抽象構件 ConcreteComponent&#xff1a; 具體構件 Decorator&#xff1a;抽象裝飾類 ConcreteDecorator&#xff1a; 具體裝飾類 抽象裝飾類代碼 public class Decorator extends Compo…

https說明

http是無狀態的&#xff0c;https是在http應用層協議和tcp傳輸控制層之間加了一層&#xff0c;主要功能包括加密傳輸內容&#xff0c;校驗信息是否完整&#xff0c;信息是否被篡改等。http的網絡傳輸&#xff0c;源端應用層發送http請求&#xff0c;傳輸到源端的控制層&#xf…

實時操作系統(FreeRTOS、RT-Thread)RISC-V

FreeRTOS&#xff1a;FreeRTOS? - FreeRTOS? RT-Thread&#xff1a;rt-thread.org VxWorks&#xff1a; QNX Neutrino RTOS&#xff1a; RT-Linux&#xff1a; 一、 實時操作系統介紹 實時操作系統&#xff08;Real Time Operating System&#xff0c;簡稱RTOS&#xff…

Python3除標準庫外更全面的XML解析方案

一、擴展解析庫方案 lxml高性能解析 from lxml import etree doc etree.parse(data.xml) # XPath 2.0增強查詢 nodes doc.xpath(//student[score>90]/name/text())優勢&#xff1a;支持XPath 2.0語法和XSLT轉換&#xff0c;比標準庫快5-10倍 BeautifulSoup混合解析 fr…

同時裝兩個MySQL, 我在MySQL5的基礎上, 安裝MySQL8

目錄 1. 前言 2. 下載MySQL 3. 安裝MySQL 3.1 第一步:選擇MySQL ?編輯 3.2 第二步:存儲地址 3.3 第三步 3.4 第四步:完成基礎配置 3.5 第五步 3.6 第六步:數據庫密碼 3.7 第七部:服務名 4. 環境變量 4.1 復制MySQL的bin地址 4.2 進入高級系統設置 4.3 PATH 4.4 更改…

Visual Studio 2022打包程序流程

Visual Studio 2022打包程序流程 打開管理拓展 安裝Microsoft Visual Studio Installer Projects 關閉軟件才能繼續安裝 安裝完成后點擊&#xff0c;解決方案&#xff0c;創建新項目 添加&#xff1a;setup project 打開軟件的路徑 復制路徑 添加文件 粘貼剛才復制的路徑&…

web3方法詳解

web3.py 是一個功能強大的 Python 庫,用于與以太坊區塊鏈交互。它提供了多種模塊和功能,涵蓋賬戶管理、智能合約交互、交易發送、區塊鏈數據查詢等。以下是 web3.py 的主要功能模塊及其用途: 1. Web3 核心模塊 功能:提供基礎連接、工具函數和核心功能。 常用方法: Web3(…

HTML5+JS實現一個簡單的SVG 貝塞爾曲線可視化設計器,通過幾個點移動位置,控制曲線的方向

三次貝塞爾曲線,二次貝塞爾曲線有什么區別 https://blog.csdn.net/xiaoyao961/article/details/148678265 SVG 貝塞爾曲線可視化設計器 下面是一個簡單的貝塞爾曲線可視化設計器&#xff0c;使用 HTML5 和 JavaScript 實現。這個設計器允許你通過拖動控制點來實時調整貝塞爾曲…

Pytorch框架——自動微分和反向傳播

一、自動微分概念 自動微分&#xff08;Automatic Differentiation&#xff0c;AD&#xff09;是一種利用計算機程序自動計算函數導數的技術&#xff0c;它是機器學習和優化算法中的核心工具&#xff08;如神經網絡的梯度下降&#xff09;&#xff0c;通過反向傳播計算并更新梯…

【Linux手冊】進程的狀態:從創建到消亡的“生命百態”

目錄 前言 操作系統進程狀態 運行狀態 阻塞狀態 掛起狀態 Linux中具體的進程狀態 R(running)運行狀態 S(sleeping)阻塞狀態 D(disk sleep)磁盤休眠狀態 T(stopped)和t(tracing stop) X(dead)終止狀態 Z(zombie)僵尸狀態 僵尸進程的危害 前言 我們在運行可執行程序…

李沐--動手學深度學習 LSTM

1.從零開始實現LSTM #從零開始實現長短期記憶網絡 import torch from torch import nn from d2l import torch as d2l#加載時光機器數據集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps)#1.定義和初始化模型參數&#xff…

面經的疑難雜癥

1.介紹一下虛擬地址&#xff0c;虛擬地址是怎么映射到物理地址的&#xff1f; 虛擬地址是指在采用虛擬存儲管理的操作系統中&#xff0c;進程訪問內存時所使用的地址。每個進程都有獨立的虛擬地址空間&#xff0c;虛擬地址通過操作系統和硬件&#xff08;如MMU&#xff0c;內存…

去噪擴散概率模型(DDPM)全解:從數學基礎到實現細節

一、 概述 在這篇博客文章中&#xff0c;我們將深入探討去噪擴散概率模型&#xff08;也被稱為 DDPMs&#xff0c;擴散模型&#xff0c;基于得分的生成模型&#xff0c;或簡稱為自動編碼器&#xff09;&#xff0c;這可以說是AIGC最近幾年飛速發展的基石&#xff0c;如果你想做…

【系統分析師】2011年真題:案例分析-答案及詳解

文章目錄 試題1【問題 1】【問題 2】【問題 3】 試題2【問題 1】【問題 2】【問題 3】 試題3【問題 1】【問題 2】【問題 3】 試題4【問題 1】【問題 2】【問題 3】 試題5【問題 1】【問題 2】【問題 3】 試題1 隨著寬帶應用快速發展&#xff0c;用戶要求系統服務提供商提供基…

【unitrix】 1.7 規范化常量類型結構(standardization.rs)

一、源碼 這段代碼實現了一個二進制數字標準化系統&#xff0c;用于將二進制數字類型&#xff08;B0/B1&#xff09;轉換為更簡潔的表示形式。 //! 二進制數字標準化模塊 / Binary Number Normalization Module //! //! 提供將二進制數字(B0/B1)標準化為更簡潔表示形式的功能…

NJet Portal 應用門戶管理介紹

nginx向云原生演進&#xff0c;All in OpenNJet&#xff01; 1. 應用門戶簡介 NJet 應用引擎是基于 Nginx 的面向互聯網和云原生應用提供的運行時組態服務程序&#xff0c;作為底層引擎&#xff0c;NJet 實現了NGINX 云原生功能增強、安全加固和代碼重構&#xff0c;利用動態加…

uni-app學習筆記三十六--分段式選項卡組件的使用

先來看效果&#xff1a; 上圖有3個選項卡&#xff08;PS:uniapp官方稱之為分段器&#xff0c;我還是習慣叫選項卡&#xff09;&#xff0c;需要實現點擊不同的選項卡時下方切換顯示對應的數據。 下面介紹下實現的過程。 1.在uniapp官方文檔下載并安裝該擴展組件&#xff1a;u…