什麼是函式過載呢? 函式過載是函式的一種特殊情況,在同一作用域中宣告幾個功能類似的同名函式,這些函式的形參列表(型別,個數,順序)必須不同。
知道了函式過載的概念,那麼我們就要知道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 ...