C++學習筆記2_函式.函式指標
1. 行內函數
void printAB(int a,int b)
{
cout<<(a)<<(b)<<endl;
}
int main(void)
{
for(int i=0;i<1000;i++)
{
int j=i+1;
printAB(i,j);//(1)
//在呼叫普通函式的時候,有壓棧的過程,要將printAB壓入棧中,要複製兩個實參,壓入棧中,還要copy返回值,還要出棧。
}
}
優化空間:
1. 改成巨集函式
#define printAB(a,b)\
cout<<(a)<<(b)<<endl;//語句
//但是巨集函式相當於巨集替換,直接將語句原封不動丟到(1)中替換而已。這是預編譯器乾的事。
2.改成inline void printAB(int a,int b);
那麼編譯器會在(1)處,將printAB(i,j);替換為(兩個花括號也是),少了很多壓棧和複製的過程。
{
cout<<(i)<<(j)<<endl;
}
注意的地方:
C++宣告和定義是可以分開寫的,要達到行內函數的效果,宣告和定義都要寫inline關鍵字。
Inline函式,僅用於程式碼量少,使用頻繁的函式中,並且要被大量迴圈執行的函式。如果存在迴圈語句,那麼Inline相當於沒寫了。
2. 引數佔位符
void function(int x,int);//第二個引數是用來佔位的,是用來方法過載的時候作區別
3. 函式過載
4.函式指標
int func(int a,int b){...}
方法1:
//定義一種函式型別
typedef int(MY_FUNC)(int,int);(推薦)
// C# delegate int MY_FUNC(int a,int b);
使用:
int main(void)
{
MY_FUNC*fp=NULL;
fp=func;
fp(10,10);
//C# MY_FUNC fp=func;
}
方法二:(不推薦)
//定義一種指向函式型別的指標型別
typedef int(*MY_FUNC_P)(int,int);
int main(void)
{
MY_FUNC_P fp=NULL;
fp=func;
fp(10,10);
}
方法三:(常用)
//在函式中定義,用於傳遞迴調函式
int main(void)
{
int(*fp)(int,int)=NULL;
fp=funcl
fp(10,10);
}
*是否能理解函式名就是一個函式指標?
注意:typedef int(MY_FUNC)(int,int);代表一種函式,MY_FUNC fun;fun不是指標,是沒有任何作用的。
5. 有函式指標作為形參的函式
void fun(int(*fun)(int,int) , int a , int b)// int(*fun)(int,int) 應該能寫成MY_FUNC_P fun
{
fun(a,b);
}