預設引數
在定義或者宣告乙個函式的時候,給它的形參賦上乙個預設值,呼叫這個函式的時候,如果沒有把實參傳入,函式就會使用我們指定的預設引數,如果傳入實參,就會使用傳入的引數。
預設引數可分為
全預設引數
在這個函式中,給所有的形參都指定了預設值。
半預設引數
在這個函式中,只給一部分的形參指定了預設值。
注意: 預設引數的設定必須是從右向左的 特性
預設引數的設定必須是從右向左的
不能在函式的宣告和定義同時設定預設引數
預設引數的給定值必須是常量或者是全域性變數
c語言中不支援預設引數
函式過載
相同作用域下,函式名相同,引數列表不同(形參個數,型別,順序的不同)的函式,就是函式過載。
注意:函式過載和函式的返回值無關
void
func
(int a,
int b)
;void
func
(int a,
double b)
;void
func
(double a,
double b)
;void
func
(double a,
int b)
;void
func
(int b)
;//以上這幾個函式構成函式過載
編譯器在編譯**期間,需要對函式的實參進行推演,根據推演的結果進行對應函式的呼叫
注意:有該函式存在,直接呼叫,如果不存在型別完全匹配的函式,則編譯器會進行隱式型別轉換,如果存在型別匹配的函式則呼叫,如果不存在(兩種情況:1.沒有型別匹配的函式 2.產生二義性),則編譯失敗
#include
using
namespace std;
intadd
(int x,
int y)
double
add(
double x,
double y)
intmain()
編譯結果如下圖
因為int型別可以隱式轉換為double型別,double型別可以隱式轉換為int型別,編譯器不知道該呼叫哪個函式,產生了二義性
底層實現原理是由於c語言和c++的函式命名規則不同
以下是在linux下執行的過程
從圖中可以看出,c語言中函式名就是我們自己取得函式名
從上圖我們可以看出,c++的函式命名後面會跟形參型別
不同系統和編譯器下函式命名風格可能不同,主要區別就是c++的函式命名後面會跟形參型別,c語言的函式命名後面不跟形參型別
引用相當於給乙個變數取了乙個別名,並沒有新定義乙個變數。 編譯器不會給引用變數分配記憶體空間,引用變數與被引用的實體共用一塊記憶體空間
特性引用在定義的時候必須初始化
一旦引用了某個實體以後,就不可以再引用其他實體
乙個變數可以有多個引用
三種傳參方式的區別
傳值傳位址
傳引用優點可以對外部實參起到保護作用
可以通過形參修改外部實參,不需要對實參進行拷貝,傳參效率高,節省空間
可以通過形參修改外部實參,不需要對實參進行拷貝,傳參效率高,節省空間
缺點不可以通過形參修改外部實參,因為形參是實參的乙份拷貝;傳參的效率低下,浪費空間
在不需要修改實參的情況下誤操作,修改了實參,可以用const修飾,避免此類情況發生;需要判空,避免操作野指標或null;**可讀性較差
可能會誤操作修改實參,可以用const修飾
下面是一些在c++中傳參時的建議
內建型別
自定義型別
如果不需要修改實參,盡量使用傳值或者傳引用+const;如果需要修改實參,建議使用傳引用
建議使用傳引用或傳引用+const
指標與引用的區別
在概念上,引用定義的是乙個別名,指標定義的是乙個的位址
引用在引用了乙個實體後就不可以引用別的實體,指標在任意時候都可以指向其他同型別的位址
引用在定義的時候必須初始化,指標不是
只有null指標,沒有空引用
有多級指標但是沒有多級引用
指標自加是向後偏移乙個型別的大小,引用自加是給引用加1
sizeof的意義不同,sizeof(引用)的大小是引用的實體型別的大小,sizeof(指標)的大小是位址空間所佔位元組數,在32位平台下始終是4位元組
引用的安全性比指標高
注意:引用和指標在底層的實現方式是完全相同的,引用就是按照指標的方式實現的
巨集的優缺點
巨集常量巨集函式
優點一改全改;巨集常量名字具有一定意義
巨集函式不是真正的函式,在預處理階段,預處理器會把巨集函式展開,減少了函式呼叫引數壓棧、開闢棧幀返回等開銷,效率提高
缺點巨集定義沒有型別,不會參與到型別檢測中去,導致**的安全性不高,並且報錯的時候定位不準確
需要加很多的括號區分;**安全性不高;不能除錯,**膨脹;巨集函式具有***
巨集函式的***:
原本我們期待的結果是20 21,但是列印出來的是20 22;這是由於巨集函式直接替換,即(++b) > (a) ? (++b) : (a),把++b運算了兩次
c++如何解決巨集的缺陷
巨集常量:用const常量代替,並且有型別,更加安全
巨集函式:inline函式替換
inline函式概念
在c++中,被inline關鍵字修飾的函式就是內聯函式。
inline函式特性
在編譯階段,編譯器會把內聯函式直接展開,少了函式呼叫開銷,提高執行速率
inline是乙個建議性的關鍵字,當修飾函式是,建議編譯器把被inline函式直接展開;一般情況下,建議**短但是被呼叫頻繁的函式作為內聯函式,遞迴函式不能作為內聯函式
inline函式具有檔案作用域
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 ...
C 函式過載,引用,內聯函式的介紹
什麼是函式過載呢?函式過載是函式的一種特殊情況,在同一作用域中宣告幾個功能類似的同名函式,這些函式的形參列表 型別,個數,順序 必須不同。知道了函式過載的概念,那麼我們就要知道c語言的編譯的時候是如何處理函式的,首先我們要編譯c風格的 我們需要讓某些函式以c的方式編譯,在函式前面加上 extern ...