二、函式過載
(二)c++處理任意型別:函式過載
函式的預設值:函式設計過程中給予形參預設值,當沒有實參時,形參有預設值,這時候會使用到預設值。當存在實參傳入,那麼會覆蓋預設值,使用實參。
如下面這段**:
第乙個呼叫點,使用傳入的實參30.1;第二個呼叫點,使用預設形參40.1。
牢記:在函式呼叫過程中:
【1. 函式預設值的賦予是自右向左依次賦予的】
這樣才可以讓和實參和形參匹配順序自左向右進行配合。如下面的**:
【2.預設值不能重複賦予】
如:
不能通過,語法不支援,如果支援,到底用哪個,導致編譯器產生二義性,直接報錯。
【3. 預設值一般設定在宣告點上】
宣告點和定義點都可以設定,為了程式的健壯性,我們一般設定在宣告上。
【小知識點:】
語義分析和語法分析的區別,看一下面一段**:
語法分析,第二行出錯,因為沒有遵循自右向左依次賦值,但在語義分析結合上下文分析時,分析第一行c=10,第二行b=20,滿足自右向左賦值的條件,所以正確,可以執行。
所以我們可以總結:語法分析只是針對這一行進行分析,但是語義分析會結合上下文進行分析。
1. c處理:巨集,泛型
現在假如要處理兩個任意型別數的相加,c語言有兩種辦法:
【1. 巨集函式】
巨集替換時不會考慮型別,直接替換,所以可以處理任意型別,那麼我們寫出:
它就會直接替換,不會考慮型別。但是巨集函式本身是不安全,因為它是在預編譯階段處理的,沒有型別檢查和安全檢查。
【2.使用泛型,即void*】
但是這個型別,本身存在巨大的缺陷:
故void*型別無法知道結尾,那麼就容易發生越界,是不安全的。
所以在c語言中沒有乙個很好的機制可以處理多個任意兩個型別的函式操作,c++作為c的衍生,為了處理這種情況,發明了函式過載機制實現,那麼為啥c語言不能使用函式過載呢?
2. c語言函式符號生成規則
c語言不能實現過載的原因就是:c函式符號生成規則導致,在c中函式的生成規則只和函式名有關,符號生成只是在函式名前面加了_,如:
不同型別引數的函式生成的符號都一樣,乙個函式符號不能表示三個函式,編譯器二義性,就會導致報錯。故c裡面同名函式不能共存,就不可能實現函式過載。
c++採用函式過載的辦法實現任意型別的處理。函式過載:同名函式可以共存,
1. 函式決議
c++支援多個同名函式構成函式過載,但是如何確定呼叫哪個函式呢,這就需要乙個函式決議的過程。
函式決議:在呼叫點決定呼叫哪個函式。它會通過下面這幾步進行決議:
【關於隱式轉換的題目:】
有下面一段**,最後輸出的結果是啥?
int main()
{ unsigned int a = 1;
char b = -1;
char rt;
rt = a > b ? 'a' :'b';
cout列印結果為b,因為在a>b等式執行時,需要根據隱式轉換規則進行型別轉換,【char->int->unsigned】,-1的二進位制補碼是11111111,而1的二進位制是0000 0001,所以b>a,故rt儲存b,輸出b。
2. c++函式符號生成規則
我們上面知道了c語言因為其函式符號生成規則,所以不支援過載,那麼c++支援過載,它的函式符號生成規則和什麼有關?
乙個函式生成的函式符號主體格式是一定的,其中可變引數和函式原型,呼叫約定有關,主體格式:
?+ 函式名 + @@ + 函式呼叫約定標識 + 函式返回值型別標識 + 函式引數型別標識+ …… + (@)z
那我們舉例幾個函式生成的符號,都預設使用_cdecl呼叫約定:函式
函式生成的符號
int sum(int ,int)
?sum@@yahhh@z
double sum(int)
?sum@@yanh@z
char sum()
?sum@@yadz
3. 影響函式過載的因素
c++可以進行函式過載的主要原因就是因為函式符號的生成,函式符號的生成和函式原型,函式呼叫約定有關,那麼哪個因素是可以對函式過載產生影響呢?
用函式名稱和實參來決議,和返回值根本沒關係。函式名稱都是sum,實參都是int,在呼叫點無法決議用哪個函式,所以函式返回值不同,不能構成函式過載。
所以當函式名一樣時,函式形參列表型別,個數,順序不同都可以構成過載函式,會產生影響。
4. 函式過載三要素
函式過載和形參有關,那麼函式過載的三要素:
加油哦!?。
C 函式的預設值 函式過載
一 函式的預設值 1 預設值一般寫在宣告中 可以寫多個宣告 int func int a,int b,int c 20 func 10,20 和 func 10,20,30 都可以 2 自左向右依次賦值 實參會替代形參 int func int a 10,int b,int c 20 func 10...
函式預設值 過載 inline函式
一 函式預設值 c89 不支援帶有預設值的函式 c 99 支援帶有預設值的函式 預設值注意事項 1 預設函式一般寫在宣告中 2 自右向左依次賦值 即設定預設值時應該從右至左 因為實參的傳遞是從前至後。如若不是這樣則報錯。3 預設值只能賦一次 4 預設值的限制 int compare int a,in...
內聯函式 函式過載 函式預設值
為了減少函式呼叫的開銷,引入了內聯函式機制。編譯器處理對內聯函式的呼叫語句時,是將整個函式的 插入到呼叫語句處,而不是產生呼叫函式的語句。inline int max int a,int b 乙個或者多個函式,名字相同,然而引數個數或者引數型別不同,這叫做函式的過載。編譯器根據呼叫語句的實參的個數和...