c過載函式,c中函式過載的原則是什麼啊?

2021-03-19 18:20:02 字數 6235 閱讀 8459

1樓:匿名使用者

c++的函式過載是指:

過載函式的名稱和返回值要相同,而形參不同。形參不同包括形參的個數和形參的型別,即不同的形參列表。

2樓:使用者阿杰

返回值和形參個數可以相同排除a、c

函式名不同就不叫過載了排除d

應該是c

c++中函式過載的原則是什麼啊?

3樓:百度使用者

函式過載的定義:

函式過載是指在同一作用域內,可以有一組具有相同函式名,不同引數列表的函式,這組函式被稱為過載函式。、

所以原則就是相同的函式名,不同的引數列表。返回值不能作為過載依據。

4樓:

函式名相同,形參型別或形引數目不同,這是最基本的要求。

c++中函式過載有啥用?

5樓:魚尾摯愛白菜

類的建構函式跟類名相同,即建構函式都同名。如果沒有函式過載機制,要想例項化不同的物件非常麻煩。

操作符過載,本質上就是函式過載,它大大豐富了已有操作符的含義,方便使用,例如「+」可用於連線字串等。

過載函式是函式的一種特殊情況,為方便使用,c++允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數(指引數的個數、型別或者順序)必須不同,也就是說用同一個運算子完成不同的運算功能。這就是過載函式。過載函式常用來實現功能類似而所處理的資料型別不同的問題。

6樓:匿名使用者

函式過載不能完全替代可變長引數……雖然函式過載可以讓你在同一個**裡寫出print(1,2,'a');和print("a=",12);而不需要寫printf("%d%d%c",1,2,'a')和printf("%s%d","a=",12);,但代價是你需要寫無數個print函式的定義……例如這個例子裡你就要同時寫int print(const int,const int,const char)函式的定義和int print(const char*,const int)函式的定義。

儘管如果函式的引數型別唯一且引數數目在一個很小的範圍內,那麼代價還是可以接受的(畢竟有安全性作為補償),但仍然是一種麻煩的辦法,c++11的變長引數模板給了一種既無需寫無數個函式定義又具有安全性的解決方法……

7樓:匿名使用者

過載是是c++的機制,是指具有同名但具有不同簽名(返回型別和引數)的一組函式可以同時存在,有編譯器在編譯時自動匹配合適函式的機制。而c不允許存在同名函式,如果需要同名但不同引數的呼叫,只能採用變參技術。

原因:c++ 編譯時,會根據函式名、返回值、引數給函式 重新取名為,有不用函式名稱、函式簽名的函式會有不同的不同的函式名稱,因此編譯時可以根據 這些要素找到匹配的呼叫函式;

而c, 在編譯時,只根據函式名稱找匹配的函式,因此不允許存在兩個同名函式。

作用:主要作用為,對外提供類似功能的統一介面。

如:開啟檔案,開啟電源,開啟窗戶等都是開啟動作,在c中我們必須提供 openfile()、openpower()、openwindow() 等一系列不同名稱的函式,這對外部呼叫帶來很多困難,因為我們必須記住所有的開啟函式名稱。但c++中我們只提供open(tfile& file),open(tpower& power), open(twindow& window)即可,呼叫者只需要記住有open()函式即可。

這回大大可以程式可讀性和開發效率。

8樓:祜風

1、函式過載是指在同一作用域內,可以有一組具有相同函式名,不同引數列表的函式,這組函式被稱為過載函式。

2、過載函式通常用來命名一組功能相似的函式,這樣做減少了函式名的數量,避免了名字空間的汙染,對於程式的可讀性有很大的好處。

3、具體優點說來有三點:

(1)、試想如果沒有函式過載機制,如在c中,必須要這樣去做:為這個print函式取不同的名字,如print_int、print_string。這裡還只是兩個的情況,如果是很多個的話,就需要為實現同一個功能的函式取很多個名字,如加入列印long型、char*、各種型別的陣列等等。

這樣做很不友好!

(2)、類的建構函式跟類名相同,也就是說:建構函式都同名。如果沒有函式過載機制,要想例項化不同的物件,那是相當的麻煩!

(3)、操作符過載,本質上就是函式過載,它大大豐富了已有操作符的含義,方便使用,如+可用於連線字串等!

9樓:匿名使用者

以algorithm裡的sort函式為例,

default (1)template

void sort (randomaccessiterator first, randomaccessiterator last);

custom (2)template

void sort (randomaccessiterator first, randomaccessiterator last, ***pare ***p);

這是

上的內容,sort有兩種形式,第一種接受兩個迭代器,然後對序列排序,第二種,接受兩個迭代器和一個自定義的比較函式來告訴sort該怎麼樣進行排序。

你可以看到,兩種形式的差別在與第二種形式多了一個引數,為了實現這種函式,

1.要麼使用變參函式,寫一個sort(iter,iter, ...)來將第三個引數作為變參

2.要麼使用函式過載函式,寫兩個引數不同的sort函式

3.要麼只寫三個引數的形式,然後給第三個引數一個預設值。

這三種方法都可以實現函式名相同,引數不同的函式。你可以在標準庫裡看到許多過載的函式,使用相同的函式名錶示我在做同一件事,而接受引數不同,可以用於不同的情況。相比於使用變參而言,第二種和第三種技術會更簡單,更方便。

10樓:匿名使用者

也就是一種多型,比如你有了電腦就可以上網聽**看電影玩遊戲一應俱全,而不必去看電視,玩小霸王或者去影院,比喻可能不恰當不過基本這個意思。

本質是c++ oop的需要,因為c裡函式名無法重複,而c++只規定函式特徵標不能重複,也就是說c++裡同一個函式名,比如***pare,可以比較字串與字串,整數與整數,甚至字串和整數的大小,而c裡就不得不用3個不同名的函式實現比如string_***pare,int_***pare之類,這顯然比較麻煩。另外變參在設計上並不完全安全因為沒有型別資訊,這也有悖oop設計理念。

c++中成員函式過載是什麼意思?

11樓:du瓶邪

過載函式

過載,英文為overloading,大概就是很多個的意思。

舉個例子,比如,我需要個函式。

取2個int的最大值。很容易,函式介面應該是(1) int max(int a, int b);

那更進一步,我取3個 int 的最大值呢,介面可以定義為(2) int max(int a, int b, int c);

對比 函式(1), (2), 的名字,是一樣的,都叫 max,就只有引數的個數不同。這是函式過載。

那現在,我需要取兩個float的最大值呢,介面也可以定義為(3) float max(float a, float b);

對比 函式(1),(3), 名字也是一樣的,叫max。引數個數也是一樣的。不過引數的型別不同。這也是函式過載。

12樓:

函式的過載,主要是說,當你傳進對應的引數的時候,呼叫的對應的函式。也就是樓上所說的多型。比如一個籃子可以裝蘋果8個或者裝梨子4個。

當你告訴籃子說我要裝蘋果,它就給你返回一個說我能裝8個。你又告訴籃子說我要裝梨子,它就給你返回一個4個。就是這個意思。

13樓:歪歪

函式過載是指在同一作用域內,可以有一組具有相同函式名,不同引數列表的函式,這組函式被稱為過載函式。過載函式通常用來命名一組功能相似的函式,這樣做減少了函式名的數量,避免了名字空間的汙染,對於程式的可讀性有很大的好處。

1.2、為什麼需要函式過載(why)?試想如果沒有函式過載機制,如在c中,你必須要這樣去做:

為這個print函式取不同的名字,如print_int、print_string。這裡還只是兩個的情況,如果是很多個的話,就需要為實現同一個功能的函式取很多個名字,如加入列印long型、char*、各種型別的陣列等等。這樣做很不友好!

類的建構函式跟類名相同,也就是說:建構函式都同名。如果沒有函式過載機制,要想例項化不同的物件,那是相當的麻煩!

操作符過載,本質上就是函式過載,它大大豐富了已有操作符的含義,方便使用,如+可用於連線字串等!

我們在開瓶瓶罐罐的時候,經常會遭遇因各種瓶口規格不同而找不到合適的工具的尷尬。所以有時候就為了開個瓶,家裡要備多種規格的開瓶器。同樣是開個瓶子嘛,何必這麼麻煩?

於是有人發明了多功能開瓶器,不管啤酒瓶汽水瓶還是軟木塞的紅酒瓶都能輕鬆開啟。

然而開瓶器的問題也會發生到程式設計中。比如我們要編寫一個函式來求一個數的絕對值,然而整數、浮點型數、雙精度型數都有絕對值,但為它們編寫的函式返回值型別卻是各不相同的。比如:

int iabs(int a);

float fabs(float a);

double dabs(double a);

這樣是不是有點備了多種開瓶器的感覺?我們能不能在程式設計中也做一個多功能的開瓶器,把所有資料型別的求絕對值都交給abs這一個函式呢?

在c++中,我們也能夠把具有相同功能的函式整合到一個函式上,而不必去寫好多個函式名不同的函式,這叫做函式的重(音chóng)載(overload)。過載的本質是多個函式共用同一個函式名。

我們先來看一個函式過載的例項:(程式6.3)

#include "iostream.h"

int abs(int a);//當引數為整型資料時的函式原型

float abs(float a);//當引數為浮點型資料時的函式原型

double abs(double a);//當引數為雙精度型資料時的函式原型

int main()

int abs(int a)//函式定義

float abs(float a)

double abs(double a)

執行結果:

int abs

int abs

a=5b=3

float abs

float abs

c=2.4

d=8.4

double abs

double abs

e=3e-009

f=3e+006

執行結果表明,abs函式果然能夠處理三種不同資料型別的資料了。那麼我們怎樣才能自己造一個「多功能工具」呢?

其實要編寫一個過載函式並不是很麻煩。首先,我們要告訴電腦,同一個函式名存在了多種定義,所以,我們要給同一個函式名寫上多種函式原型(如程式6.3的第二到第四行);其次,我們要對應這些函式原型,分別寫上這些函式的定義(如程式6.

3的主函式體之後,對三個abs函式的定義)。

然而電腦又是如何來識別這些使用在不同環境下的「工具」的呢?

在日常生活中使用到多功能工具,如果我們不知道具體應該使用哪個工具,我們會把每個工具放上去試一試,如果只有唯一一個工具適合,那麼我們就毫無疑問地能夠確定就是使用它了。但是如果出現了兩個或者兩個以上工具都能適合,我們就分不清到底應該使用哪個是正確的了。

電腦的做法和我們是類似的。電腦是依靠函式宣告時參數列中引數個數、各引數的資料型別和順序來判斷到底要執行哪個函式的。因此,當過載函式參數列完全相同的時候,電腦便無法判斷應該執行哪個函式,於是程式就出錯了。

我們瞭解了電腦是如何識別過載函式以後,發現要編寫一個過載函式還是需要注意一些地方的,那就是:在過載函式中,任意兩個函式的參數列中的引數個數、各引數的資料型別和順序不能完全一樣。例如int func(int a,char b)和float func(int c,char d)就不能過載,因為它們的引數個數、各引數的型別和順序完全一樣,即使形參名不同、返回值型別不同也是無濟於事的。

在呼叫一個過載函式時,可能會發生找不到一個完全合適的函式。這時候,就需要進行資料型別的轉換。由於這種方法可能導致資料丟失或資料型別不嚴格符合,且在充分考慮問題後,這種情況是可以儘量避免的,所以這裡不再就這個問題論述。

有興趣的讀者可以查閱其他c++的參考資料。

從某種意義上說,過載函式是方便了函式的使用者。在前一節我們知道,如果完成了所有函式的編寫,那麼完成一個程式就像搭積木一樣簡單了。然而如果功能相似名字卻不同的函式太多,那麼多「積木」搭起來也未必簡單。

當函式的編寫者充分考慮了不同情況下應該執行稍有不同的函式,函式的使用者就不必為這些小細節而煩惱了。不過過載函式的函式名還是應該符合其功能,如果把功能完全不同的函式過載,那麼就大大影響了程式的可讀性。

c中不能作為函式過載依據的是什麼?aconstb返

b 返回型別 不能作為過載函式的依據,因為函式的返回值並不是總是用到,所以不能作為過載依據。關於a選項,我在c primer上看到 對於函式值傳遞的情況,因為引數傳遞是通過複製實參建立一個臨時變數傳遞進函式的,函式內只能改變臨時變數,但無法改變實參。則這個時候無論加不加const對實參不會產生任何影...

C中的建構函式可以被過載嗎舉個例子

當然可以。版 權public class test test string s public static void main string main 可以,也經常會過載,最常見的是無慘建構函式和有引數的建構函式,例子我就不舉了,如果沒幫助就無視吧。c 建構函式和解構函式可以過載嗎 建構函式可以被過...

為什麼C中的過載操作符函式能定義成非成員函式

可以定義成友元函式,友元函式就不是成員函式了比如,類int中的過載 專 int operator int a 和友元函式是等價的 如果屬有幫助記得采納 謝謝 c 中,過載運算子的函式可以定義為類的成員函式,但是書上說在使用此過載運算子的時候,運算子左邊必 這個是單目的 字首寫法,前面加上運算子的話,...