詳細介紹C語言中重載函數的應用

2020-12-14 速途網

詳細介紹C語言中重載函數的應用

作者 悠虎 2012年08月22日06:03 速途網

  之前,我們給大家介紹過C++中的重載運算符,大家可以看看這篇文章,進行了解,《C++基礎之重載運算符的詳細介紹》。今天給大家介紹重載函數。

  重載函數(overloaded function)是C++支持的一種特殊函數,C++編譯器對函數重載的判斷更是C++語言中最複雜的內容之一

  首先我們先明確一下重載函數的定義:在相同的聲明域中的函數名相同的,而參數表不同的,即通過函數的參數表而唯一標識並且來區分函數的一種特殊的函數。

  您也許要問,函數為什麼要重載呢?何時應該選擇函數重載(function overloading),何時又不呢?這也是我要在下面介紹的。

  當將要定義一組函數,使它們執行一系列的操作,但是它們是應用在不同的參數類型上的。此時我們可以選擇重載函數。

  例如:

  上面的三個函數都可以大概地說成判斷一組數中的最大值,對於函數的用戶來說,他們並不關心函數定義的細節,也就是說他們不關心判斷兩個整數的大小和判斷數組(vector容器)數的大小應該使用不同的函數,而對於程序的設計者來說這可是不得不想到的。程式設計師必須記住並查找每個函數名。而函數的重載把程式設計師從這種問題的複雜性中解放了出來,C++提供了這種支持。上面的三個比較大小的函數可以定義成:

  對!通過參數就可以一眼分辨不同的函數。

  同時函數的重載也有它不適用的情況。例如:在開發文本編輯器的過程中,會涉及到一系列控制光標的函數,如下:

  看過這四個函數不言而喻,它們是控制光標在屏幕上的位置的,即:向上移動光標,向下移動光標,向左移動光標,向右移動光標。如果我現在把它們寫成重載函數,每個都是Screen& Move( );顯然對於程式設計師來說是不易理解的。因此對於函數重載的使用我們應遵循應用的邏輯,而不是簡單地因為它的存在就必須使用它。程式設計師不應該勉強使用重載函數。

  您有沒有想過C++編譯器是如何判斷您調用的是重載中的哪個函數?即使它們的函數名相同。您也許會毫不猶豫的回答:是通過函數的參數表。其實識別的過程並不是像您想像中的那麼的容易,其中涉及到參數的等級劃分,參數轉換等諸多方面,下面我就一一進行講解。

  那麼好,問題出現了。S (2.4 );將調用上面四個函數中的哪一個呢?

  編譯器判斷重載函數的第一步是確定該調用中所考慮的重載函數的集合,該函數集合被稱為候選函數(candidant function)。所謂候選函數就是與被調用函數同名的函數。上面的前四個函數都可以成為候選函數(當然可以是多個),而唯有Max ( int , int ) 被排除在外了。

  編譯器判斷重載函數的第二步分為兩動作。第一個動作是編譯器從第一步選出的候選函數中調出可行函數(viable function)。可行函數的函數參數個數與調用的函數參數個數相同(如S ( int )),或者可行函數的參數可以多一些,但是多出來的函數參數都要有相關的預設值(如 S (double , double =1.2 );)第二個動作是根據參數類型的轉換規則將被調用的函數實參轉換(conversion)成候選函數的實參。這裡本著充分利用參數類型轉換的原則,換句話說,儘可能的使用上參數類型轉換。當然轉換要以候選函數為轉換的目標。上面的函數中只有兩個是可行函數,它們分別是S ( int ); S ( double , double )。

  如果依照參數轉換規則沒有找到可行函數,則該調用就是錯誤的,則說沒有函數與調用匹配,屬於無匹配情況(no match function)。

  編譯器判斷重載函數的第三步是從第二步中選出的可行函數中選出最佳可行函數(best match situation)。在最佳可行函數的選擇中,從函數實參類型到相應可行函數參數所用的轉化都要劃分等級,根據等級的劃分(ranked),最後選出最佳可行函數。最佳可行函數即編譯器要調用的函數。

  希望本文能夠給你帶來幫助。

相關焦點

  • 函數重載
    關於重載需滿足兩個關鍵點(並非C++特有):1.函數名相同2.形參不同(滿足個數,類型,順序中至少一個不同)        C語言不支持函數重載,為了實現相似功能,我們需要給函數定義不同的名字。而在C++中則允許使用相同的函數名實現相似功能,但為了達到這一目的,在代碼編譯時就必須連同參數列表一同編譯,從而區分多個重載函數。
  • c++之重載函數學習總結
    一、C++中的函數重載:1、函數重載的概念:用同一個函數名定義不同的函數當函數名和不同的參數搭配時函數的含義不同注意:在c語言中是沒有函數重載這個概念的。 int func(int x)所以說c語言裡面不支持函數重載。
  • 【C++札記】深入淺出C++函數重載
    學過C語言的同學應該很清楚,在C語言中,同一個程序中是不能定義多個名稱相同的函數,否則編譯會報重定義的錯誤信息,但是C++中則允許定義多個名稱相同的函數,在C++中,這稱之為函數重載,讓我們來看看更官方一點的定義,函數重載是指在同一作用域內,可以有一組具有相同函數名,不同參數列表的函數,這組函數被稱為重載函數。
  • C/C++編程筆記:運算符重載丨重載C++中的New和Delete運算符
    重載大小為16的新運算符構造函數稱為名稱:Yash年齡:24重載刪除運算符注意:在上述新的重載函數中,我們已經通過new運算符分配了動態內存,但是它應該是global new運算符,否則它將以遞歸形式輸出:新操作員重載 數組:0 1 2 3 4 刪除運算符重載注意:在上面的代碼中,在新的重載函數中,我們無法使用:: new int [5]分配內存,因為它將以遞歸方式進行。
  • C語言基礎:詳細介紹四種程序結構
    下面介紹C語言的四種程序結構 。(1)順序結構 順序結構的程序設計是最簡單的,只要按照解決問題的順序寫出相應的語句就行,它的執行順序是自上而下,依次執行。
  • 運算符重載(多態):最通俗易懂的「重載」解釋(附代碼)
    在面向對象的編程方法中,有一種使對象操作更美觀、更人性化,更方便的編程技術:重載!本文將以簡單的代碼與理論對運算符重載做詳細解釋以供大家學習、參考!——以C++為例以運算符「+」為例,通常情況下,我們使用加號的方式如下:int a=2, b=3, c=4;a=b+c;功能就是將int類型的兩個變量b,c算術相加,返回int類型的值並賦值給變量a。「+」運算符重載就是將運算符擴展到能夠把用戶自定義的兩種類型相加,一般情況下都是重載「+」把兩個對象相加。
  • 重載運算符、多重繼承
    ////輸入輸出流#include<iostream>#include<iomanip>//C語言中是<stdio.h> C++ 中是 <cstdlib>//#include<stdio.h>#include<cstdlib>
  • C++ 類、繼承、重載《Rice C++ 學習開發》
    a + b); }};int main(){ temp temp1; temp1.x = 10; temp1.y = 20; std::cout << "Temp1 return value:" << temp1.add(temp1.x, temp1.y) << std::endl; return 0;}其中:在c語言中
  • C語言-輸入與輸出函數
    眾所周知,C語言需要輸入和輸出,那麼今天小編我就帶領大家去學習這個編程必不可少的輸入和輸出函數。一,首先我們先來學習輸出函數(printf)其意義是:按指定的格式輸出值。因此,函數在括號中的參數都由以下兩部分組成:1、 格式控制串:格式控制串是一個字符串,必須用雙引號括起來,它表示了輸入輸出量的數據類型。在printf函數中可以在格式控制串內出現非格式控制字符,這時在顯示屏幕上會顯示源字符串。2、參數表:參數表中給出了輸出的變量。當有多個變量時,用英文逗號(,)分開。
  • C++中的虛函數重載
    ,下來研究了一下,發現C++中虛函數重載後會產生很多有意思的情況,在這裡總結了一下。C++中有重載(overload)和重寫(override)以及重定義這幾個概念。1 overload:指的是相同作用域中的兩個函數的函數名相同,但參數列表的個數、順序、類型不同。而override指的是子類中重新定義的父類的虛函數;2 override:overload要求兩個函數的參數列表必須不同,但是不要求這兩個函數必須是虛函數。
  • 學習c語言筆記——C庫函數printf()
    c語言中的printf是什麼來的?」。我答:「它是一個函數,主要用來輸出運算結果。」 ,下面就給大家介紹C庫函數printf()使用方法。下面我們通過一個調用c庫函數的c語言案例來說明printf()函數的使用方法,如c語言1。
  • 詳解C++ 的隱式類型轉換與函數重載!
    作者 | 櫻雨樓責編 | 屠敏在上篇中,我們討論了C++中與隱式類型轉換相關的一些話題,而函數重載是與隱式類型轉換相關的又一大重要話題,本篇將要討論的內容即為隱式類型轉換與函數重載之間的相關話題。隱式類型轉換與重載確定C++中,如果同時定義了多個函數名稱相同,但函數籤名不同的函數,則此行為稱為函數重載。調用重載函數時,編譯器將根據調用的參數數量與類型確定被調用的是哪一個函數,此過程稱為重載確定。
  • python3使用ctypes在windows中訪問C和C++動態連結庫函數示例
    python3使用ctypes在windows中訪問C和C++動態連結庫函數示例這是我們的第一個示例,我們儘量簡單,不傳參,不返回,不訪問其他的動態連結庫一 測試環境介紹和準備c語言函數,如果你源碼是.c也就是用c語言編譯則不需要加extern "C"。
  • 詳細介紹下C/C++那些時間函數
    首先介紹下C++標準中的chrono庫chrono是一個關於時間的庫,起源於boost,現在是C++的標準,話說現在的C++標準好多都是源於boost,要進標準的特性似乎都會先在boost試驗一番。duration<int, ratio<3600>>;using hours2 = duration<int, ratio<3600, 1>>;using hours2 = duration<int, ratio<7200, 2>>;詳細看完上述例子您也明白了
  • 你真的知道C語言裡extern "C" 的作用嗎?
    經常在C語言的頭文件中看到下面的代碼:
  • 自定義 Python 類中的運算符和函數重載(上)
    你可能想知道同一內置運算符或函數如何對不同類對象進行不同操作的。這分別稱為運算符重載和函數重載。本文將幫助你了解此機制,以便你可以在自己的 Python 類中執行相同的過程,使對象更 Pythonic。
  • 物聯網應用開發之C語言介紹
    C語言描述問題比彙編語言迅速、工作量小、可讀性好、易於調試、修改和移植,而代碼質量與彙編語言相當。C語言一般只比彙編語言代碼生成的目標程序效率低10%~20%。因此,C語言可以編寫系統軟體。 當前階段,在編程領域中,C語言的運用非常之多,它兼顧了高級語言的彙編語言的優點,相較於其它程式語言具有較大優勢。計算機系統設計以及應用程式編寫是C語言應用的兩大領域。
  • C語言函數調用棧(二)
    因此,為了保證程序能正確執行,所有的函數調用均應遵守一致的調用約定。5.1 常見調用約定下面分別介紹常見的幾種函數調用約定。1. cdecl調用約定又稱C調用約定,是C/C++編譯器默認的函數調用約定。所有非C++成員函數和未使用stdcall或fastcall聲明的函數都默認是cdecl方式。
  • 長見識:你真的知道C語言裡extern "C" 的作用嗎?
    經常在C語言的頭文件中看到下面的代碼:
  • 深入淺出剖析C語言函數指針與回調函數
    回調函數在Linux內核裡得到了廣泛的應用,接下來,我將引用Linux內核中文件操作結構體來詳細的說明。Linux內核中的應用,為學習Linux內核,分析linux內核原始碼打下了基礎。三、回調函數在Posix應用API中的使用      其實,在Posix應用編程裡,我們也能用到回調函數,我們來看看多線程編程中,經常使用的pthread_create函數:我們先來看看它的原型:1int  pthread_create((pthread_t *thread,  pthread_attr_t  *attr