1. 程式人生 > >C++學習筆記2_函式.函式指標

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);
}