c++中推薦使用內聯函式替代c中巨集**片段,使用inline關鍵字宣告內聯函式,。
c中巨集**片段。
#define void fun(a,b) (a < b ? a : (b))
c++中內聯函式時關鍵字inline必須和函式定義結合在一起,否則編譯器會直接忽略內聯請求。
inline void fun_inline()和實現寫在一起,不用宣告函式。
inline
void
fun_inline()
內聯函式在最終生成的**中沒有定義,編譯器會直接將內聯函式體替換到呼叫的地方。所以內聯函式沒有壓棧出棧,效率會高一些。
如下面**,main函式中呼叫內聯函式fun_inline,最終生成的**就是機械的把fun_inline替換成實現。
inline
void
fun_inline()
intmain()
system
("pause");
return0;
}
c++編譯器不一定准許函式的內聯請求
內聯函式是一種對編譯器的請求,因此編譯器可能拒絕該請求,如果拒絕了內聯請求,那麼內聯函式就跟普通函式沒有區別。內聯函式由編譯器處理,直接將編譯後的函式體插入到呼叫的地方。巨集**片段是由預處理處理的,進行簡單的文字替換,沒有任何編譯過程。
c++編譯器能夠進行編譯優化,就算函式不是內聯函式,也可能被編譯成內聯函式。
函式引數賦乙個預設值,若呼叫函式時沒有引數就是用預設值,若呼叫函式有引數時就不適用預設值。
void
fun(
int x =10)
intmain()
預設引數規則:如果函式有預設引數和非預設引數,那麼所有的預設引數應都位於非預設引數之後。
//inline void fun(int x = 10, int y)//非法語句,預設引數應該在最後
inline
void
fun(
int y,
int x =10)
函式呼叫必須寫夠引數
void
fun(
int x,
int)
intmain()
可以預設引數和佔位引數結合使用。這樣做主要是為以後的程式擴充套件用
void
fun(
int x,
int=0)
intmain()
用乙個函式名定義不同的函式。
函式過載至少滿足下面乙個條件:
void
fun(
int x)
void
fun(
int x,
int y)
void
fun(
double x)
void
fun(
double x,
int y)
函式的返回值不是過載的判斷標準。
void
fun(
int x)
//報錯,「int fun(int)」: 過載函式與「void fun(int)」只是在返回型別上不同
intfun
(int x)
預設函式和過載函式組合,有可能存在二義性,c++編譯器不允許這麼操作。
void
fun(
int x)
void
fun(
int x,
int y =0)
intmain()
//宣告乙個函式型別
typedef
void
(mtypefun)
(char
* x)
;mtypefun* fun =
null
;//宣告乙個函式指標型別
typedef
void
(*mptypefun)
(int x)
;mptypefun pfun =
null
;//宣告乙個函式指標變數型別
void
(*mvarfun)
(int x,
int y)
;
C 建構函式理解
正確理解qt中建構函式 widget widget qwidget parent qwidget parent ui new ui widget include using namespace std class base base int val m num val 1 private int m...
機器學習核函式理解
核函式要滿足的條件稱為mercer s condition。核函式的作用就是隱含著乙個從低維空間到高維空間的對映,而這個對映可以把低維空間中線性不可分的兩類點變成線性可分的。在機器學習中常用的核函式,一般有這麼幾類,也就是libsvm中自帶的這幾類 1 線性 k v 1,v 2 v 1,v 2 2 ...
lua學習 lua函式理解
詞法定界指 巢狀的函式可以訪問他外部函式中的變數。第一類值指 可以被存放在變數中,也可以存放在表中,可以作為函式的引數,還可以作為函式的返回值。的值function foo x return 2 x end這段 實際上就等效於 foo function x return 2 x end所以實際上lu...