程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++復習筆記---類的函數指針和普通函數指針

C++復習筆記---類的函數指針和普通函數指針

編輯:C++入門知識

我們在類裡面會定義成員函數,同時我們也希望定義成員函數指針。因此需要解決3個問題,第一怎麼定義類的函數指針,第二賦值,第三使用。
我定義一個類,
class A
{
public:
    int add(int,int);
    int mul(int,int);
    int div(int,int);
};

int A::add(int a,int b)
{
    return a + b;
}

int A::mul(int a,int b)
{
    return a * b;
}

int A::div(int a,int b)
{
    return (b !=0 ? a/b : a);
}
我現在想要定義一個指針,指向A類型中返回值為int,參數為兩個int的函數指針。熟悉C的同學馬上會寫出typedef int (*oper)(int,int)。但是這個用到C++裡就有問題了,
因為我們知道,類的非static成員方法實際上還有this指針的參數。比如add方法,它實際的定義可能會這樣int add(A* this,int a,int b);因此,我們不能簡單把C語言裡的那套東西搬過來,我們需要重新定義這種類型的指針。正確做法是加上類型,typedef int (A::*Action)(int,int)
typedef int (A::* Action)(int,int);

int main()
{
    A a;
    Action p = &A::add;
    cout << (a.*p)(1,2) << endl;
    return 0;
}
Action p = &A::add;這個就是賦值語句
調用的時候注意,直接這樣(*p)(1,2)是不行的,它必須綁定到一個對象上(a.*p)(1,2);我們也可以把類的函數指針定義在類的聲明裡。
class A
{
public:
    int add(int,int);
    int mul(int,int);
    int div(int,int);

    int (A::*oper)(int,int);
};
上面這種方式是針對非static成員函數的,那麼static成員函數的函數指針應該怎麼定義呢,還能用上面這種方式嗎?我們知道static成員函數是沒有this指針的,所以不會加上的類的限定,它的函數指針定義方式和C裡面的函數指針定義方式一樣的。
class A
{
public:
    int add(int,int);
    int mul(int,int);
    int div(int,int);

    static int sub(int,int);
};

int A::sub(int a,int b)
{
    return a - b;
}

int main()
{
    int (*pp)(int,int) = &A::sub;
    cout << (*pp)(10,5) << endl;
   
    return 0;
}
總結起來,非static成員函數的函數指針需要加上類名,而static的成員函數的函數指針和普通的函數指針一樣,沒有什麼區別。
另外注意一點的是
如果函數指針定義在類中,調用的時候有點區別。
class A
{
public:

    int add(int,int);
    int mul(int,int);
    int div(int,int);

    int (A::*pfunc)(int,int);
};www.2cto.com

int main()
{  www.2cto.com
    A a;
    a.pfunc = &A::add;
    cout << (a.*(a.pfunc))(1,2) << endl;
    return 0;
}


作者:yg2362

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved