學習總結 函式

2021-10-01 11:18:19 字數 4268 閱讀 5689

小記:靜默如初,安之若素

定義在相同的作用域,定義同名的函式,但是它們的引數要有所區分,這樣的多個函式構成過載關係。

注:函式的過載和返回值無關

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兩...