目錄

一.函數的默認參數
1.默認參數的性質 ?
2.函數默認參數的注意事項
二.函數的占位參數
三.函數的重載? ?
1.重載的性質和條件
(1)修改參數的個數
(2)修改參數的類型
(3)修改參數的順序
2.函數重載的注意事項?
(1)當引用&作為函數參數
(2)不可以用函數的默認參數作為重載條件?
在接觸函數函數之前,我們使用函數時形式參數都只是定義了并沒有定義的同時初始化,但其實函數的形式參數是可以定義的同時初始化的,也就是形式參數可以有默認值,這時形式參數的默認值稱之為函數的默認參數
? 函數默認參數的性質為:
(1)當函數有默認參數時,該參數可以不傳值,則該參數的值就為默認值,當給該參數傳值時,傳的值會將默認值覆蓋,即修改形參
(2)沒有默認值的參數則必須傳參
(3)當函數有多個參數并且有默認參數時,當調用時傳值的個數小于函數參數個數時,會優先給無默認值的參數傳值
? 我們以最簡單的打印函數為例

輸出結果

我們可以看到,在主函數調用func函數并給函數傳實參,a的值進行了修改并打印?
? 在上面的基礎上,我們定義形參a時給其初始化

輸出結果

程序運行的過程為,形參a的默認值為10,在主函數調用并傳值20給函數,形參a的值修改為20并打印,當函數形參有默認值時,可以調用時不給函數傳值,則形參的值就是默認值

輸出結果

可以看到,即使我們不給函數傳值,函數依然調用成功并將形參a的默認值打印?
? 我們在此基礎上給函數多個參數,當函數有多個參數時,有默認值的參數可以不傳值,但是無默認值的參數必須傳值,當傳值的個數少于參數個數時,會優先給無默認值的形參傳值

輸出結果

當我們不給無默認值的參數傳值時

編譯器報錯信息

報錯信息是因為函數中形參a沒有默認值,就必須傳值
經過上述驗證,我們基本驗證了函數的默認參數的性質
2.函數默認參數的注意事項? 函數有多個參數,當我們給一個參數默認值時,則這個參數后面的所有參數都必須有默認值
? 我們依然以上面的函數為例,我們給函數三個形參

輸出結果

可以看到我們正常輸出了,下面我們只給a默認值,而b,c沒有默認值

編譯器報錯信息

編譯器報錯信息顯示默認實參不在形參列表。這是因為我們a之后的參數沒有默認值導致的,我們給三個參數默認值試試

輸出結果

可以看到正常輸出了,當我們只給c默認值試試

輸出結果

可以看到也正常輸出了,這是因為c就是最后一個參數,后面沒有參數了,假如c后面有參數,則c后面的參數也必須要有默認值
? 經過上述驗證,我們基本驗證,有默認值的參數后面的參數也必須要有默認值
二.函數的占位參數? 占位參數,顧名思義就是一個參數占了個位置,就比如我們在火車站等車時,要去上廁所就會將自己的書包放在座位上好占個位置,別人看到你的書包就知道這個作為有人,但并不知道這個人是誰
? 占位參數的性質:占位參數沒有默認值的時候必須給它傳值,當占位參數有默認值時,可以不給它傳值
? 我們依然以上面的函數為例

可以看到我們定義了兩個參數,但是第二個參數沒有名字也沒有初始值
輸出結果

可以看到我們正常輸出了,我們不給占位參數傳值試試

編譯器報錯信息

報錯信息顯示函數調用的參數太少,這就是因為我們沒有給占位參數傳值,但是當占位參數有默認值時,按照默認參數的性質,可以不給占位參數傳值

輸出結果
可以看到,當占位參數有默認值時,不給其傳值也可以正常輸出
經過上述驗證,我們基本驗證占位參數的性質:占位參數沒有默認值的時候必須給它傳值,當占位參數有默認值時,可以不給它傳值
三.函數的重載? ? 1.重載的性質和條件函數的重載主要應用于函數重復命名的問題,增強程序的復用性
? 函數重載有以下三個條件:
(1)兩個函數的作用域相同;
(2)兩個函數的名字相同
(3)兩個函數參數的類型或者參數的個數或者參數的順序不同
? 當兩個函數滿足上面三個條件時,我們就說兩個函數可以產生重載,即這兩個相同名字的函數可以同時存在和調用且互不影響
? 我們一一來驗證上面的條件

當我們定義兩個一模一樣的函數,在主函數調用時,編譯器傻了,因為調用func()時上面兩個函數都符合,編譯器不知道該調用哪個,我們來看編譯器報錯信息

編譯器顯示void?func函數已有主體,這就是我們定義兩個一模一樣的函數導致的,由于在同一個源文件中,函數的作用域相等,故我們只修改第三個條件,下面我們來修改其中一個函數的參數
(1)修改參數的個數
第一個函數參數個數為0,第二個函數個數為1,當我們在主函數調用func()時,大家可以猜下會調用哪個函數呢,結果肯定是第一個沒有參數的函數,因為調用時沒有傳參
輸出結果

輸出的沒有參數的函數的結果
我們在調用時傳一個參數,則會調用第二個參數個數為1的函數

輸出結果

可以看到當我們調用時傳了一個參數,結果是參數個數為1的函數的結果?
(2)修改參數的類型? 我們在第一個函數定義一個int型的參數,在第二個函數定義一個double型的參數,我們在調用時根據傳的值的類型決定調用哪個參數
我們在調用時傳整形的值
輸出結果為參數類型為整形的函數的結果?

我們在調用時傳double的值

輸出結果為參數類型為double的函數的結果

? 我們依然以上面的函數為例,第一個函數我們先定義一個int型的參數再定義一個double的參數,第二個函數我們先定義一個double型的參數再定義一個int型的參數
? 我們在調用時傳一個int型的參數和double的參數

輸出結果為參數類型為?int?double的函數的結果

我們在調用時傳一個idouble型的參數和int的參數

輸出結果為參數類型為??double?int的函數的結果

? 經過上述驗證,當兩個函數滿足上面三個條件時,可以產生函數重載
2.函數重載的注意事項?(1)當引用&作為函數參數? 當引用&作為函數參數時,有無const修飾決定調用函數的不同
我們在調用函數時傳入變量a

輸出結果為參數為int型的參數

之所以傳入一個int型的值不調用第二個用const修飾引用,是因為const修飾一個變量后,該變量就變為已讀,可以近似看成一個常量,當我們調用時傳入一個常量

輸出結果就變為了第二個用const修飾參數的函數的結果

? 當一個兩個參數的函數有一個默認參數,而另一個一個參數的函數沒有默認參數時,在主函數調用時,編譯器也會因為二義性而報錯

當我們在主函數調用func(10)的時候,由上面默認參數的性質可以知道,兩個函數都滿足調用條件,故編譯器因為二義性報錯

報錯信息顯示有多個重載函數符合調用條件,即調用不明確,我們在日常編程中應避免這種二義性????????
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
文章名稱:C++使用函數的高級操作-創新互聯
網站鏈接:http://www.js-pz168.com/article24/ddejce.html
成都網站建設公司_創新互聯,為您提供網站導航、用戶體驗、虛擬主機、域名注冊、外貿建站、小程序開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯