小記:靜默如初,安之若素
定義在相同的作用域,定義同名的函式,但是它們的引數要有所區分,這樣的多個函式構成過載關係。
注:函式的過載和返回值無關
eg: 影象庫(包含很多繪圖函式)
//c語言實現(c語言不能有同名函式)
void
drawcircle
(int x,
int y,
double r)
void
drawrect
(int x,
int y,
double w,
double h)..
.//c++語言實現
void
draw
(int x,
int y,
double r)
void
draw
(int x,
int y,
double w,
double h)..
.
1 #include
2using
namespace std;34
intfoo
(int a)58
9void
foo(
int a,
int b)
1013
14void
foo(
int a,
float b)
1518
19int
main
(int argc,
char
* ar**)
20~
函式過載匹配(編譯器決定)
呼叫過載關係的函式時,編譯器將根據實參與形參的匹配程度(記憶體),自動選擇最優的版本。
當前g++編譯器的一般匹配規則:
完全匹配 >= 常量轉換 > 公升級轉換 > 降級轉換 > 省略號匹配
1 #include
2using
namespace std;34
//char --> int ::公升級轉換(記憶體浪費)
5void
bar(
int i)69
//char --> const char : 常量轉換
10void
bar(
const
char c)
1114
15//short(2 byte) --> char(1 byte) : 標準轉換(降級轉換)
16void
fun(
char c)
//char 1 byte
1720
//short(2 byte) --> int(4 byte) : 公升級轉換
21void
fun(
int i)
//int 4 byte
2225
26//省略號匹配
27void
hum(
int i,..
.)//...可變長引數
2831
32//double(8 byte) --> int(4 byte) : 降級轉換
33void
hum(
int i,
int j)
3437
3839
intmain
(int argc,
char
* ar**)
40
函式過載實現原理
c++編譯器是通過對函式進行換名,將參數列資訊整合到新的名字中,實現解決函式過載和名字衝突的問題。
筆試題:c++中 extern 「c」 的作用?
答案:在c++函式宣告的前面加入extern 「c」, 要求c++編譯器不對該函式換名,方便c程式直接呼叫。
注:extern 「c」 宣告的函式無法過載。定義
只有型別沒有形參變數名的引數成為啞元
void
func
(int
/*啞元*/
)
使用啞元的特徵場景
1)相容舊**
eg: 演算法庫
void
video_func
(int a,
int b)
使用者:
intmian
(void)--
----
----
----
----
----
公升級了演算法庫:void
video_func
(int a,
int/*啞元*/
) 使用者:
intmain
(void
)
2)操作符過載中區分前後++/–
可以在宣告函式時,為它的部分或全部引數指定預設值,在呼叫該函式時,如果不給傳遞實參,就取預設值作為相應形參的值。
eg:
void
func
(int a,
int b =0)
func
(100,0
);func
(100);
//與上面的呼叫等價
預設引數必須靠右,如果函式的乙個引數帶有預設值,那麼該函式的右側所有引數都必須帶有預設值。
eg:
void
func
(int a =0,
int b)
//error
void
func
(int b,
int a =0)
//true
1 #include
2using
namespace std;34
void
foo(
int a,
int b =20,
int c =30)
589//預設引數宣告必須靠右寫(靠右原則)
10//error: default argument missing for parameter 2 of 『void foo1(int, int, int)』
11/*
12 void foo1(int a = 10, int b, int c = 30)
13
預設引數使用時注意過載時可能存在歧義問題;如果乙個函式定義和宣告分開,預設引數寫在函式宣告部分,定義部分不寫。
eg:
void
func
(預設引數)
;//宣告
void
func()
//定義
1 #include
2using
namespace std;34
//函式宣告
5void
foo(
int a,
int b =20,
int c =30)
;6//void foo(int a, int = 20, int = 30);//true78
//注意過載函式時的歧義錯誤
9//void foo(int x){}
1011
intmain
(int argc,
char
* ar**)
1218
//函式定義
19void
foo(
int a,
int b/*= 20*/
,int c/* = 30*/)20
定義:
使用inline修飾的函式,表示這個函式是內聯函式,編譯器將會嘗試做內聯優化,減小函式呼叫的開銷(空間換時間)。
筆試題:inline 關鍵字的作用?(定義)
適用場景
1)多次呼叫小而簡單的函式適合內聯;
2)呼叫次數極少或者大而複雜的函式不適合內聯;
3)遞迴函式不能內聯;
注:內聯只是一種建議而不是強制要求,乙個函式能否內聯優化主要取決於編譯器,有些函式不加inline修改也會被編譯器預設處理為內聯優化,有些函式即使加了inline關鍵字也會被編譯器忽略。
函式學習總結
1.為什麼定義函式,使用函式 在程式的設計過程中,會在許多地方出現想同的 為了減少 數量,讓程式變得更加美觀,此時可以將這段程式單獨作為乙個整體,並用識別符號起乙個名字,當時使用時,直接呼叫函式名即可。這段程式叫作子程式,就是我們所說的函式。2.函式的定義 1 定義的語法形式 資料型別 函式名 形式...
函式學習總結
從開學到現在學習函式知識三個周,我從中學會了很多,但 也有很多疑惑和不懂的地方,下面是我的一些學習總結 第一點函式需要先定義,定義之後才能使用,函式的一般形式 如下 第二點函式呼叫的含義 為函式分配儲存空間,執行函式。函式呼叫的過程 第三點引用的概念 型別名 引用名 某變數名。某個變數的引 用和這個...
函式學習總結
一.知識點 1.語法形式 資料型別 函式名 形式參數列 函式體 注 1 資料型別指返回值型別 void無返回值 2 形參表可空 但 不可省 2.函式呼叫三種方式 1 傳數值 實參賦值給形參,在被呼叫函式中形參值可以改變,但不影響主調函式的實參值,主函式的值仍為呼叫前的值,例如用swap函式交換ab兩...