函式過載 引用 內聯函式

2021-10-12 16:43:50 字數 3682 閱讀 4621

預設引數

在定義或者宣告乙個函式的時候,給它的形參賦上乙個預設值,呼叫這個函式的時候,如果沒有把實參傳入,函式就會使用我們指定的預設引數,如果傳入實參,就會使用傳入的引數。

預設引數可分為

全預設引數

在這個函式中,給所有的形參都指定了預設值。

半預設引數

在這個函式中,只給一部分的形參指定了預設值。

注意: 預設引數的設定必須是從右向左的 特性

預設引數的設定必須是從右向左的

不能在函式的宣告和定義同時設定預設引數

預設引數的給定值必須是常量或者是全域性變數

c語言中不支援預設引數

函式過載

相同作用域下,函式名相同,引數列表不同(形參個數,型別,順序的不同)的函式,就是函式過載。

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

void

func

(int a,

int b)

;void

func

(int a,

double b)

;void

func

(double a,

double b)

;void

func

(double a,

int b)

;void

func

(int b)

;//以上這幾個函式構成函式過載

編譯器在編譯**期間,需要對函式的實參進行推演,根據推演的結果進行對應函式的呼叫

注意:有該函式存在,直接呼叫,如果不存在型別完全匹配的函式,則編譯器會進行隱式型別轉換,如果存在型別匹配的函式則呼叫,如果不存在(兩種情況:1.沒有型別匹配的函式 2.產生二義性),則編譯失敗

#include

using

namespace std;

intadd

(int x,

int y)

double

add(

double x,

double y)

intmain()

編譯結果如下圖

因為int型別可以隱式轉換為double型別,double型別可以隱式轉換為int型別,編譯器不知道該呼叫哪個函式,產生了二義性

底層實現原理是由於c語言和c++的函式命名規則不同

以下是在linux下執行的過程

從圖中可以看出,c語言中函式名就是我們自己取得函式名

從上圖我們可以看出,c++的函式命名後面會跟形參型別

不同系統和編譯器下函式命名風格可能不同,主要區別就是c++的函式命名後面會跟形參型別,c語言的函式命名後面不跟形參型別

引用相當於給乙個變數取了乙個別名,並沒有新定義乙個變數。 編譯器不會給引用變數分配記憶體空間,引用變數與被引用的實體共用一塊記憶體空間

特性引用在定義的時候必須初始化

一旦引用了某個實體以後,就不可以再引用其他實體

乙個變數可以有多個引用

三種傳參方式的區別

傳值傳位址

傳引用優點可以對外部實參起到保護作用

可以通過形參修改外部實參,不需要對實參進行拷貝,傳參效率高,節省空間

可以通過形參修改外部實參,不需要對實參進行拷貝,傳參效率高,節省空間

缺點不可以通過形參修改外部實參,因為形參是實參的乙份拷貝;傳參的效率低下,浪費空間

在不需要修改實參的情況下誤操作,修改了實參,可以用const修飾,避免此類情況發生;需要判空,避免操作野指標或null;**可讀性較差

可能會誤操作修改實參,可以用const修飾

下面是一些在c++中傳參時的建議

內建型別

自定義型別

如果不需要修改實參,盡量使用傳值或者傳引用+const;如果需要修改實參,建議使用傳引用

建議使用傳引用或傳引用+const

指標與引用的區別

在概念上,引用定義的是乙個別名,指標定義的是乙個的位址

引用在引用了乙個實體後就不可以引用別的實體,指標在任意時候都可以指向其他同型別的位址

引用在定義的時候必須初始化,指標不是

只有null指標,沒有空引用

有多級指標但是沒有多級引用

指標自加是向後偏移乙個型別的大小,引用自加是給引用加1

sizeof的意義不同,sizeof(引用)的大小是引用的實體型別的大小,sizeof(指標)的大小是位址空間所佔位元組數,在32位平台下始終是4位元組

引用的安全性比指標高

注意:引用和指標在底層的實現方式是完全相同的,引用就是按照指標的方式實現的

巨集的優缺點

巨集常量巨集函式

優點一改全改;巨集常量名字具有一定意義

巨集函式不是真正的函式,在預處理階段,預處理器會把巨集函式展開,減少了函式呼叫引數壓棧、開闢棧幀返回等開銷,效率提高

缺點巨集定義沒有型別,不會參與到型別檢測中去,導致**的安全性不高,並且報錯的時候定位不準確

需要加很多的括號區分;**安全性不高;不能除錯,**膨脹;巨集函式具有***

巨集函式的***:

原本我們期待的結果是20 21,但是列印出來的是20 22;這是由於巨集函式直接替換,即(++b) > (a) ? (++b) : (a),把++b運算了兩次

c++如何解決巨集的缺陷

巨集常量:用const常量代替,並且有型別,更加安全

巨集函式:inline函式替換

inline函式概念

在c++中,被inline關鍵字修飾的函式就是內聯函式。

inline函式特性

在編譯階段,編譯器會把內聯函式直接展開,少了函式呼叫開銷,提高執行速率

inline是乙個建議性的關鍵字,當修飾函式是,建議編譯器把被inline函式直接展開;一般情況下,建議**短但是被呼叫頻繁的函式作為內聯函式,遞迴函式不能作為內聯函式

inline函式具有檔案作用域

C 函式過載 引用 內聯函式

2 函式過載 3 引用 4 內聯函式 在宣告或定義函式時,給函式的引數設定乙個預設值,當使用者對函式進行呼叫時,如果傳遞了實參,則使用使用者傳遞的實參 如果沒有傳遞則使用預設值。預設引數必須從右往左給出 不能在函式宣告和定義的位置同時給出 預設引數在提供時 常量 全域性變數 c語言不支援。相同作用域...

C 命名空間 函式過載 引用 內聯函式

c 關鍵字 c 98 有63個 命名空間解決了 名字衝突,有作用域的作用 命名空間的使用格式 namespace n1使用方法 1.n1 變數 2.using n1 變數 3.using namespace n1 c 的輸入輸出 標頭檔案 iostream 命名空間 using namespace ...

C 函式過載,引用,內聯函式的介紹

什麼是函式過載呢?函式過載是函式的一種特殊情況,在同一作用域中宣告幾個功能類似的同名函式,這些函式的形參列表 型別,個數,順序 必須不同。知道了函式過載的概念,那麼我們就要知道c語言的編譯的時候是如何處理函式的,首先我們要編譯c風格的 我們需要讓某些函式以c的方式編譯,在函式前面加上 extern ...