我定義一個類,
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);
}
我現(xiàn)在想要定義一個指針,指向A類型中返回值為int,參數(shù)為兩個int的函數(shù)指針。熟悉C的同學(xué)馬上會寫出typedef int (*oper)(int,int)。但是這個用到C++里就有問題了,{
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);
}
因為我們知道,類的非static成員方法實際上還有this指針的參數(shù)。比如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;
}
int main()
{
A a;
Action p = &A::add;
cout << (a.*p)(1,2) << endl;
return 0;
}
Action p = &A::add;這個就是賦值語句
調(diào)用的時候注意,直接這樣(*p)(1,2)是不行的,它必須綁定到一個對象上(a.*p)(1,2);我們也可以把類的函數(shù)指針定義在類的聲明里。
上面這種方式是針對非static成員函數(shù)的,那么static成員函數(shù)的函數(shù)指針應(yīng)該怎么定義呢,還能用上面這種方式嗎?我們知道static成員函數(shù)是沒有this指針的,所以不會加上的類的限定,它的函數(shù)指針定義方式和C里面的函數(shù)指針定義方式一樣的。調(diào)用的時候注意,直接這樣(*p)(1,2)是不行的,它必須綁定到一個對象上(a.*p)(1,2);我們也可以把類的函數(shù)指針定義在類的聲明里。
class A
{
public:
int add(int,int);
int mul(int,int);
int div(int,int);
int (A::*oper)(int,int);
};
{
public:
int add(int,int);
int mul(int,int);
int div(int,int);
int (A::*oper)(int,int);
};
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;
}
總結(jié)起來,非static成員函數(shù)的函數(shù)指針需要加上類名,而static的成員函數(shù)的函數(shù)指針和普通的函數(shù)指針一樣,沒有什么區(qū)別。{
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;
}
另外注意一點的是
如果函數(shù)指針定義在類中,調(diào)用的時候有點區(qū)別。
class A
{
public:
int add(int,int);
int mul(int,int);
int div(int,int);
int (A::*pfunc)(int,int);
};
int main()
{
A a;
a.pfunc = &A::add;
cout << (a.*(a.pfunc))(1,2) << endl;
return 0;
}
{
public:
int add(int,int);
int mul(int,int);
int div(int,int);
int (A::*pfunc)(int,int);
};
int main()
{
A a;
a.pfunc = &A::add;
cout << (a.*(a.pfunc))(1,2) << endl;
return 0;
}