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

2021-08-22 14:45:21 字數 2760 閱讀 1995

什麼是函式過載呢?  函式過載是函式的一種特殊情況,在同一作用域中宣告幾個功能類似的同名函式,這些函式的形參列表(型別,個數,順序)必須不同。

知道了函式過載的概念,那麼我們就要知道c語言的編譯的時候是如何處理函式的,首先我們要編譯c風格的**,我們需要讓某些函式以c的方式編譯,在函式前面加上 extern "c" ,此時編譯器就以c的風格來進行編譯,那麼我們會發現,c方式在編譯的時候,他是將函式解析成_函式名的格式,因此若出現同樣的函式名,編譯器無法區分,就會報錯

extern "c" int add(int a, int b);

int main()

這裡我們再來了解乙個叫「名字修飾」的概念:是在函式編譯的過程中,是將函式,變數的名稱重新改編的機制,也就是編譯器為了區分各個函式,將函式通過一定的演算法,重新生成乙個全域性的唯一的名稱。

我們可以看到,函式在底層使用的其實不是函式的add名字,而是被重新修飾過得乙個複雜的名字,被重新修飾的名字包括了:函式名字和型別。這就是為什麼c++函式過載幾個相同名字的函式要求其引數列表不同的原因,只要引數列表不同,經過一系列的修飾之後,就可以變成乙個全域性唯一的名字

引用概念:引用不是新定義乙個變數,而是給已存在變數取乙個別名,編譯器不會為引用變數開闢空間,他和引用變數共用一塊記憶體空間。

*int a = 10;

int& ra = a;

引用型別必須和實體型別一致常引用

const int a = 10;

int& ra = a;//不可以

const int& ra = a;

const int&ra = 20;

引用的使用場景:可以作為引數和返回值。

傳引用就不存在值拷貝,他是直接用的引用的實體來進行的資料運算

//void swap(int& a, int& b)

//int& test1(int& a)

////傳引用 作為形參

/*int a = 10;

int b = 20;

swap(a, b);*/

//作為返回值

/*int a = 10;

test1(a);*/

但不可以返回棧上的引用若返回棧上的引用存在隱患,返回值為棧上的引用,函式呼叫完成,棧空間釋放,所以之後誰都可以覆蓋此處空間的

int& add1(int a , int b)

int& sum = add1(10, 20);

cout <

add1(100, 200);

cout <

此時返回c的引用,是在棧上的乙個空間,所以在呼叫一次add,但沒有將其值賦值給sum,在此輸出,就會變成300.對於傳值,傳址,傳引用,那個效率更高呢?

經過測試我們發現,傳址和傳引用幾乎一樣,那麼這又是為什麼?

我們其實引用在底層實現和指標是一摸一樣的。

那麼他們兩個有什麼區別呢?

1.引用在定義的時候必須初始化,而指標不作要求

2.引用在初始化時引用了乙個實體,之後就不能在引用別的實體,而指標可以在任何時候指向任何乙個同一型別的實體

3.沒有null引用,但有null指標

4.sizeof的含義不用,引用結果為引用型別的大小,而指標始終是位址空間所佔的位元組數,在32位平台下是4個位元組

5.引用自加1即實體加1,但指標+1是向後偏移乙個型別的大小

6.有多級指標但沒有多級引用

7.訪問實體方式不同,指標需要解引用,而引用會由編譯器完成

8.引用比指標更安全

以inline修飾的函式叫內聯函式,編譯時,c++會在呼叫內聯函式的地方展開,沒有函式壓棧的開銷,提高了效率

特點:

inline是一種以時間換空間的做法,所以**很長或有遞迴則不適合。

inline對於編譯器只是一種建議,編譯器會自動優化,若函式內部有遞迴或迴圈,則會忽略掉inline

我們發現inline和巨集非常類似,那麼對於巨集的優缺點是什麼呢?

優點:

1.提高效能

2.曾倩**復用性

缺點:

1.可讀性差

2.無型別檢查

3.不可調式

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