国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】函數(shù)重載詳解

這篇具有很好參考價值的文章主要介紹了【C++】函數(shù)重載詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

C語言下的函數(shù)名弊端

#include <stdio.h>

int Add(int a, int b)
{
    return a + b;
}

我編寫了一個簡單的 Add 函數(shù)來執(zhí)行整數(shù)相加,它既簡單又能夠達到我想要的效果。然而,如果我現(xiàn)在需要一個能夠執(zhí)行浮點數(shù)相加的函數(shù)怎么辦呢?一種方法是重新編寫一個函數(shù),但是問題是該如何命名呢?已經(jīng)有一個 Add 函數(shù)了,如果取相同的名字就會出現(xiàn)命名沖突,而重新選擇名字又顯得繁瑣。為了解決這個問題,C++中引入了函數(shù)重載。

概念

函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域聲明幾個功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個數(shù)或類型或類型順序)不同,常用來處理實現(xiàn)功能類似數(shù)據(jù)類型不同的問題。
注意:對返回值沒有要求。如果返回值不同也能構成重載的話,那么當調(diào)用兩個無參且返回值不同的同名函數(shù)時,到底是調(diào)用哪一個函數(shù)編譯器并不清楚,會產(chǎn)生二義性。

參數(shù)類型不同

#include <iostream>
using namespace std;

int Add(int x, int y)
{
    return x + y;
}

double Add(double x, double y)
{
    return x + y;
}

int main()
{
    printf("%d\n", Add(1, 2));
    printf("%lf\n", Add(3.2, 2.8));

    return 0;
}

這里兩個同名函數(shù)參數(shù)類型不同構成重載。

值得注意的是:在調(diào)用存在函數(shù)重載的函數(shù)時,傳入的參數(shù)類型要與期望調(diào)用的函數(shù)的參數(shù)類型匹配,否則可能會導致歧義。例如,下面的代碼中,調(diào)用 Add 函數(shù)時,傳入的參數(shù) 3.2 和 1 的類型分別為 double 和 int,可能導致編譯器無法確定應該調(diào)用哪個重載函數(shù)。在這個示例中,我們只需要屏蔽掉兩個 Add 函數(shù)中的一個就不會報錯了(會發(fā)生隱式類型轉(zhuǎn)化)。

【C++】函數(shù)重載詳解,c++,開發(fā)語言?

參數(shù)個數(shù)不同

#include <iostream>
using namespace std;

void funcA()
{
    cout << "funcA()" << endl;
}

void funcA(int a)
{
    cout << a << endl;
}

int main()
{
    funcA();
    funcA(1);

    return 0;
}

參數(shù)個數(shù)不同同樣構成重載。?

我在上一篇博客中介紹了缺省參數(shù):給傳參加上自動擋-CSDN博客?
可能你會好奇,如果上面第二個 funA 函數(shù)的形參加上缺省值能不能構成重載呢?我們來試下吧。

【C++】函數(shù)重載詳解,c++,開發(fā)語言

我們看到編譯器直接紅溫了。因為當調(diào)用無參的 funcA 函數(shù)時編譯器不知道調(diào)用的是哪個函數(shù),可能你是真的無參,可能你是想用缺省值,這就造成了二義性。所以如果你寫了這樣的兩個函數(shù),當你調(diào)用時必須要傳參。這里也可以發(fā)現(xiàn)這兩個函數(shù)確實構成了重載,它們的參數(shù)個數(shù)確實是不同的。但是也只能調(diào)用帶參數(shù)的那個函數(shù),所以看似寫了兩個函數(shù),實際上只有一個是可以用的。因此這種重載的形式是沒意義的。

參數(shù)類型順序不同

#include <iostream>
using namespace std;

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

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

int main()
{
    fun('a', 1);
    fun(1, 'a');

    return 0;
}

這里雖然兩個函數(shù)的參數(shù)類型都是一個 int 一個?char,但是順序不同,因此也構成重載。

為什么支持函數(shù)重載

到目前為止,你應該對C++中函數(shù)重載的條件和價值有了初步的了解。那么,為何C語言不支持這樣的高級功能,而C++卻能夠做到呢?下面我們將更深入地探討這個問題。

回顧一下,在C/C++中,程序的運行經(jīng)歷了四個關鍵步驟

1. 預處理階段:在這個階段,主要完成宏替換、頭文件展開、注釋刪除以及條件編譯等操作。處理后會生成一個后綴為 .i 的文件,為后續(xù)編譯過程提供了基礎。

2.?編譯:.i 文件的基礎上進行語法檢查,包括語法分析、詞法分析、語義分析和符號匯總等操作。這個階段的輸出是一個匯編代碼文件(.s?文件)。值得強調(diào)的是,在生成匯編代碼時,函數(shù)的調(diào)用會被標記為一個 call?指令,其中存儲了該函數(shù)在代碼段的地址。當程序執(zhí)行到這個 call?指令時,會跳轉(zhuǎn)到相應的函數(shù)匯編代碼處,并開始創(chuàng)建函數(shù)棧幀以及執(zhí)行具體函數(shù)的實現(xiàn)。需要特別注意的是,如果函數(shù)的定義和聲明分離,這里的 call?指令并沒有具體的地址,只是先標記個名字,具體的函數(shù)地址會在最后的鏈接階段通過這個名字去查找。如果找不到函數(shù)定義,鏈接階段會報錯。

3. 匯編:將代碼翻譯成機器語言,簡單來說就是將?.s?文件中的匯編代碼轉(zhuǎn)換成二進制的機器碼并生成?.o 文件。并且會生成符號表,符號表記錄了程序中使用的各種符號(如變量、函數(shù)名、常量等)以及它們在內(nèi)存中的地址或其他相關信息

4. 鏈接:將編譯生成的目標文件合并為可執(zhí)行文件。在鏈接階段,編譯器將解析符號引用,確定符號的地址,執(zhí)行重定位,最終生成一個包含所有必要信息的可執(zhí)行文件,以便在運行時被操作系統(tǒng)加載和執(zhí)行。這一過程確保了程序的各個部分正確連接,并能夠在內(nèi)存中協(xié)同工作。編譯中提到的鏈接不確定的函數(shù)地址就是在這一步驟中通過合并匯總后的符號表完成的。鏈接成功后,windows下生成后綴為 .exe的可執(zhí)行文件,Linux下則是默認生成?a.out 的可執(zhí)行文件。

現(xiàn)在你對這四個步驟已經(jīng)有一定的了解了,那么我們來解決如何尋找函數(shù)地址,也就是如何為函數(shù)命名的問題。這里以Linux下的 gcc 和 g++編譯器來展示C和C++在編譯階段是怎么為函數(shù)命名的。

首先來看 C++對應的 g++編譯器是怎么做的:?

【C++】函數(shù)重載詳解,c++,開發(fā)語言

這里我用 vim 寫了一段代碼,接下來我們看一下用 g++編譯過后的結果:

【C++】函數(shù)重載詳解,c++,開發(fā)語言

可以發(fā)現(xiàn)在Linux下,采用g++編譯完成后,函數(shù)名字的修飾發(fā)生改變,編譯器將函數(shù)參數(shù)類型信息添加到修改后的名字中。修飾過后的名字以 _Z 開頭,接著是函數(shù)名的字符個數(shù),然后是函數(shù)名,最后是參數(shù)類型的簡稱。這也就解釋了為什么函數(shù)重載支持參數(shù)個數(shù)、類型、類型順序的不同,但不支持返回值的不同,因為在這個命名規(guī)則中并未包含返回值信息。

接下來用同一段代碼我們來看看C語言編譯器也就是Linux下的gcc編譯器是怎么命名的:

【C++】函數(shù)重載詳解,c++,開發(fā)語言

注意到了吧,在Linux下使用gcc編譯后,函數(shù)名并沒有被修飾,仍然保持原始函數(shù)名。這也解釋了為什么C語言無法支持函數(shù)重載,因為同名函數(shù)將無法被編譯器區(qū)分。

windows下vs編譯器對函數(shù)名字修飾規(guī)則相對復雜難懂,但道理都是類似的,這里就不做細致的研究了,感興趣的話可以上網(wǎng)找一下相關資料。文章來源地址http://www.zghlxwxcb.cn/news/detail-772865.html

到了這里,關于【C++】函數(shù)重載詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • C++ 學習 ::【基礎篇:05】:C++ 函數(shù)重載認識及使用、簡單介紹:C++ 支持函數(shù)重載的原因

    C++ 學習 ::【基礎篇:05】:C++ 函數(shù)重載認識及使用、簡單介紹:C++ 支持函數(shù)重載的原因

    本系列 C++ 相關文章 僅為筆者學習筆記記錄,用自己的理解記錄學習!C++ 學習系列將分為三個階段: 基礎篇、STL 篇、高階數(shù)據(jù)結構與算法篇 ,相關重點內(nèi)容如下: 基礎篇 : 類與對象 (涉及C++的三大特性等); STL 篇 : 學習使用 C++ 提供的 STL 相關庫 ; 高階數(shù)據(jù)結構與算

    2024年02月06日
    瀏覽(26)
  • 【C++】函數(shù)重載 & 引用 & 內(nèi)聯(lián)函數(shù)

    【C++】函數(shù)重載 & 引用 & 內(nèi)聯(lián)函數(shù)

    目錄 一,函數(shù)重載 1,函數(shù)重載的概念 2,C++支持函數(shù)重載的原理 二,引用 1,引用概念 2,引用特性 3,常引用 4,做參數(shù) 5,做返回值 6,傳值、傳引用效率比較 7,值和引用的作為返回值類型的性能比較 8,引用和指針的區(qū)別 三,內(nèi)聯(lián)函數(shù) 1,概念 2,特性 自然語言中,一個

    2024年02月08日
    瀏覽(19)
  • c++ ——命名空間、缺省函數(shù)、函數(shù)重載

    在C/C++中,變量、函數(shù)和后面要學到的類都是大量存在的,這些變量、函數(shù)和類的名稱將都存 在于全局作用域中,可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化, 以避免命名沖突或名字污染,namespace的出現(xiàn)就是針對這種問題的 簡單一句話命

    2024年02月16日
    瀏覽(29)
  • C++ 面向?qū)ο螅?)——重載運算符和重載函數(shù)

    C++ 面向?qū)ο螅?)——重載運算符和重載函數(shù)

    C++ 允許在同一作用域中的某個 函數(shù) 和 運算符 指定多個定義,分別稱為 函數(shù)重載 和 運算符重載 。 重載聲明是指一個與之前已經(jīng)在該作用域內(nèi)聲明過的函數(shù)或方法具有相同名稱的聲明,但是它們的參數(shù)列表和定義(實現(xiàn))不相同。 當您調(diào)用一個 重載函數(shù) 或 重載運算符 時

    2024年02月10日
    瀏覽(23)
  • C++入門:函數(shù)缺省參數(shù)與函數(shù)重載

    C++入門:函數(shù)缺省參數(shù)與函數(shù)重載

    目錄 1.函數(shù)缺省參數(shù) 1.1 缺省參數(shù)概念 1.2 缺省參數(shù)分類 2.函數(shù)重載 2.1 函數(shù)重載概念 2.2 C++支持函數(shù)重載的原理 缺省參數(shù)是 聲明或定義函數(shù)時 為函數(shù)的 參數(shù)指定一個缺省值 。在調(diào)用該函數(shù)時,如果沒有指定實 參則采用該形參的缺省值,否則使用指定的實參,有點備胎的意

    2024年02月12日
    瀏覽(23)
  • 【C++】函數(shù)重載及引用

    【C++】函數(shù)重載及引用

    目錄 一、函數(shù)重載 ?1、函數(shù)重載的概念 ?2、名字修飾 二、引用 ?1、引用概念 ?2、引用特性 ?3、常引用 ?4、引用的使用場景 ? ?4.1 做參數(shù) ? ?4.2 做返回值 ?5、傳值、傳引用效率比較 ?6、引用和指針的區(qū)別 函數(shù)重載: 是函數(shù)的一種特殊情況,C++允許在 同一作用域中 聲明

    2024年02月10日
    瀏覽(17)
  • 函數(shù)重載和引用【C++】

    函數(shù)重載和引用【C++】

    函數(shù)重載: 重載函數(shù)是函數(shù)的一種特殊情況。 為方便使用,C++允許在 同一作用域 中聲明幾個功能類似的 同名 函數(shù),但是這些同名函數(shù)的形式參數(shù)(指1.參數(shù)的個數(shù) 2.類型 3.順序)必須 至少有一個 不同 根據(jù)這些同名函數(shù)的參數(shù)表的不同, 達成傳入?yún)?shù)類型不同,調(diào)用的函

    2024年04月08日
    瀏覽(25)
  • C++系列-函數(shù)重載

    函數(shù)名可以相同, 提高復用性 同一個作用域下 函數(shù)名相同 函數(shù)參數(shù)不同 – 參數(shù)個數(shù)不同 – 參數(shù)順序不同 – 參數(shù)類型不同 不可以使用返回值作為重載的條件 引用作為重載 參數(shù)可以分為const和非const。 函數(shù)重載遇到默認參數(shù)

    2024年02月12日
    瀏覽(17)
  • 【C++入門】函數(shù)重載

    函數(shù)重載就是在同一個作用域內(nèi),允許存在參數(shù)不同的同名函數(shù) 。 例子: 例子: 例子: 注意這里的順序指的是參數(shù)類型的順序,而不是參數(shù)名的順序。 比如下面的例子就不構成函數(shù)重載。 C++ 支持函數(shù)重載的本質(zhì),其實是因為 C++ 特殊的函數(shù)名修飾規(guī)則。 我們知道 C 語言

    2024年02月15日
    瀏覽(23)
  • C++語言基礎——函數(shù)(詳解)

    C++語言基礎——函數(shù)(詳解)

    目錄 函數(shù)是什么 函數(shù)的定義 主函數(shù)舉例 ?空函數(shù) 函數(shù)的調(diào)用 語法格式 舉例說明:計算x的n次方 遞歸 遞歸的主要點 遞歸的結構 條件 遞歸使用的場景 函數(shù)全名叫 計算機函數(shù) ,它可以幫助你完成一些特定的程序。你可以把它簡單理解成一把手槍。 手槍的作用: 完成幾發(fā)子

    2024年01月21日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包