文章轉自微信公眾號:Coder梁(ID:Coder_LT)
函數重載
函數重載還有一個別名叫函數多態,其實我個人感覺函數多態這個名字更好理解更恰當一些。
函數多態是C++
在C語言基礎上的新特性,它可以讓我們使用多個同名函數。當然這些同名函數的參數是要有區別的,我們在函數調用的時候,編譯器會自動根據我們傳入的參數,從多個同名函數當中找到我們調用的那一個。和面向對象里的多態的概念很接近。
我們在定義函數的時候,編譯器只會查看參數的數目和類型,而不會理會參數的名稱。只要參數的數量以及類型不完全相同,就會被認為是不同的函數。
比如:
1 2 3 4 5 | void print( const char *str, int width); void print( double d, int width); void print( long l, int width); void print( int i, int width); void print( const char *str); |
上面列舉的5個函數它們彼此之間的函數參數的數量和類型都不完全相同,因此會被視為是不同的函數。我們在使用的時候編譯器會根據我們傳入的參數使用對應的函數。
1 2 3 4 5 | print( 'pancakes' , 15); // use 1 print( 'pancakes' ); // use 5 print(1999.0, 10); // use 2 print(199, 23); // use 4 print(199L, 15); // use 3 |
這當然沒有問題,如果我們這樣使用呢:
1 2 | unsigned year = 2021; print(year, 6); |
我們可以發現我們這里傳入的參數類型是unsigned int
,它不和任何函數的入參類型匹配。這個時候編譯器并不會放棄,而是會嘗試使用標準類型轉換強制進行匹配。但問題來了,我們有三個版本的函數的第一個入參是數字類型,于是就有了三種變量轉換的方式。這個時候C++
將拒絕這種函數調用,進行報錯。
同樣,一些看起來彼此不同的參數也是不能共存的,比如:
1 2 | double cube( double x); double cube( double &x); |
看起來一個是值傳遞一個是引用傳遞,但是對于編譯器來說,顯然它是無法分辨我們究竟要調用哪一個的。
還有一點需要注意,就是const
修飾符。
1 2 | void dribble( char *bits); //1 void dribble( const char *bits); //2 |
dribble
函數有兩個類型,一個用于const
指針,一個用于常規指針,編譯器將會根據實參是否為const
來決定使用哪個函數。因為將非const
值賦給const
變量是合法的,但反之是非法的。
另外,編譯器區分函數是根據函數的參數數量和類型并不是根據函數的返回值。所以下面的兩個聲明是有問題的:
1 2 | long gronk( int n, float m); double gronk( int n, float m); |
因為它們的參數數量以及類型都是一樣的,盡管返回類型不同,但編譯器依然無法區分。
這個問題經常在面試當中出現,面試官會故意挖坑問你,函數重載的依據是什么。如果兩個函數的返回類型不同,但是參數一樣,能不能重載。很多同學對重載的概念記憶不是非常深刻,面試的時候腦子一熱就中招了,所以一定要注意。
到此這篇關于C++ 函數重載詳情介紹的文章就介紹到這了,更多相關C++ 函數重載內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!