C 函式的高階特性

2021-07-02 15:12:24 字數 4003 閱讀 7944

函式過載:

編譯器會為每乙個函式產生乙個內部名稱。重新命名機制與函式的形參有關,與函式返回值無關。所以函式過載函式名相同,形參列表不同才能過載。

注意:c++程式需要呼叫已經被編譯的c函式,c++提供了乙個c連線交換指示符extern "c"來解決這個問題

#ifdef_cplusplus

extern "c"

#endif

上述**是告訴c++編譯器,函式foo是c鏈結函式,應該為它生成名稱為_foo而不是foo_int_int,並指示聯結器到c語言的庫中去尋找該函式的定義。

注意:並不是兩個函式的名字相同就能構成過載,全域性函式和類的成員函式同名不算過載,因為作用域不同。全域性函式的作用域為檔案作用域,成員函式:類作用域。
區別 a::func//a類的成員函式  ::func//全域性域的func
注意隱式的轉換導致函式過載的二義性。
**如下
#include using namespace std;

void output(int x);

void output(float x);

void output(int x)

void output(float x)

int main(void)

2.成員函式的過載,覆蓋和隱藏
過載:
1.具有相同的作用域(即定義在同乙個類中)
2.函式名字相同
3.引數型別.順序或者數目不同(包括const引數和非const引數)//const修飾整個函式,而不是形參
4.virtual關鍵字可有可無
覆蓋:
1.不同的作用域
2.函式名稱相同
3.引數列表完全相同
4.基函式必須是虛函式。
virtual關鍵字告訴編譯器,派生類的相同的成員函式應該放在vtable中,並且替換基類相應的成員函式的槽位
虛函式的覆蓋有兩種方式:完全重寫和擴充套件,擴充套件指派生類虛函式首先呼叫基類的虛函式,再增添新的功能。
好玩的隱藏:
派生類的函式與基類的函式同名,但是引數列表有所差異,此時,不論有無virtual關鍵字,基類的函式在派生類中將被隱藏。
派生類函式與基類的函式同名,引數列表也相同,但是基類函式沒有virtual關鍵字,此時,基類的函式在派生類中將被隱藏。
#include using namespace std;

class base

void g(float x)

void h(float x)

};class derived:public base

void g(int x)

void h(float x)

};int main(void)

如果我們要跨越類邊界的過載,可以在派生類中定義任何地方顯示的使用using關鍵字,

比如在例子中使用 using base::g;這樣的話 就在派生類中產生了過載,避免了隱藏。

或者我們也可以這樣 void g(int x)呼叫傳遞

3.引數的預設值
規則1:引數預設值的使用規則是把引數預設值放在函式的宣告中,而不要放在定義體中。
規則2:如果函式有多個引數,那麼引數只能從後向前的依次預設,否則呼叫語句就會怪模怪樣。
4.函式內聯代替巨集
c++語言支援函式內聯,其目的是為了提高函式的執行效率。
c程式中,可以使用巨集**來提高效率,本身不是函式,也就省去了引數壓棧,生成組合語言的call呼叫,返回引數,執行return等過程,從而提高了速度,但是會產生
不可估計的邊際效應,並且不能除錯。
但是c++的內聯函式可以除錯的,內聯函式的可調式是在debug版本,並未真正的內聯的時候進行除錯。
c++的marco無法操作類的私有資料成員。
內聯函式:對於任何內斂函式,編譯器在符號表中存放函式的宣告,包括名字,引數型別,返回值型別(符號表是編譯器用來收集和儲存字面常量和某些符號常量的地方),
若編譯器沒有發現內聯函式存在錯誤,該函式的**也被放在符號表中,在呼叫乙個內聯函式是,編譯器會檢查呼叫是否正確(型別安全檢查,自動型別轉換),如果正確,
內聯函式的**會直接替換函式呼叫語句,於是省去了函式呼叫的開銷。這個過程與預處理不同,因為預處理不能進行型別安全檢查和自動型別轉換。假設內聯函式是成員
函式,物件的this會被放在合適的地方。
1.關鍵字inline必須與函式定義體放在一起才能使函式真正內聯,放在宣告前不起作用。
2.定義在類宣告中的成員函式自動的成為內聯函式。但是是否真正內聯看成員函式如何定義。
3.內聯函式是以**膨脹為代價,僅僅省去了函式呼叫的開銷,從而提高程式的執行效率。開銷只包括了引數壓棧,跳轉,退棧,返回等操作。不包括函式**執行,所以
**過長,或者函式體含複雜的控制結構,那麼執行時間比函式呼叫大很多,內聯意義不大、
4.建構函式與析構函式會隱藏一些行為,如"偷偷的"呼叫基類或成員物件的建構函式和析構函式,所以不要輕易讓建構函式和析構函式稱為內聯函式。
6.型別轉換函式class mystring

}
建構函式本意是:構造乙個長度為size的字串,用字元c來初始化記憶體單元。
但是無形中會有乙個型別轉換的作用,把乙個size_t型別的整數轉換為mystring物件,比如:
mystring str = 20;把20轉換為mystring物件,operator=賦值
當出現這種情況,我們可以在建構函式前面加explicit要求將其宣告為顯示的,也就是說使用者呼叫的時候必須顯示的呼叫建構函式來初始化物件。
型別轉換 operator type(){} 函式無返回型別(type就是返回型別),無引數(this是引數),必須是非靜態的成員函式。一旦型別轉換為基本型別,就不用進行
過載《運算子了。
任何不會修改資料成員的成員函式都應該宣告為const型別,在編寫const成員函式試圖修改資料成員的**,或者呼叫了其他的非const的成員函式,編譯器將指出錯誤。
static成員函式是不能定義成const的,static成員函式只是全域性函式,不存在const一說。

c 函式的高階特性

c 函式的高階特性 c 中增加了過載 overload 內聯 inline const,virtual四種新機制。其中過載和內聯機制既可以用於全域性函式,也可以用於類的成員函式,const 和virtual 機制僅用於類的成員函式。1.函式過載 c 採用過載的理由 l 可以將語義,功能相似的幾個函式...

C 函式的高階特性 函式過載

對比於c 語言的函式,c 增加了過載 overloaded 內聯 inline const 和virtual 四種新機制。其中過載和內聯機制既可用於全域性函式也可用於類的成員函式,const 與 virtual 機制僅用於類的成員函式。1.過載 overloaded 過載的理由 1 在c 程式中,可...

C 函式的高階特性 函式過載

對比於c 語言的函式,c 增加了過載 overloaded 內聯 inline const 和virtual 四種新機制。其中過載和內聯機制既可用於全域性函式也可用於類的成員函式,const 與 virtual 機制僅用於類的成員函式。1.過載 overloaded 過載的理由 1 在c 程式中,可...