成員函數指針

1.對於成員函數,用到函數名的地方,函數名錶示的意義與全局函數或靜態函數有所區別,函數名只表示函數名稱(或函數變量(對象))。如:對成員函數中調用test()是可以的,但調用(*test)()是非法的,顯示Error:“*”的操作數必須是指針。這表示test不能再表示指針(在全局函數中不存在此問題),&test也是不行的。

2.對於在調用成員函數時,A::test()與test()在類內部是一樣的,都A::表示test()與類A綁定了。在外部表示不一樣A::表示要調用靜態的成員函數。

3.對於int *C::func();和int C::(*func)();是不同的。int *C::func()等價於int *func();。int C::(*func)()和int (*func)()也是不一樣的。對於int (*func)()這樣的函數指針定義直接用一個函數地址定義,沒有對象綁定,對於類成員函數,有類型的綁定,成員函數地址是和全局函數地址表示不同,和類型相關,直接賦值函數地址定義的話不行。那麼這就出現一個定義叫類成員(函數或變量)指針。先看如下程序:

class C
{

public:

 void (C::*func1)();//放到類外一樣

 void func2() { cout << "func2()" << endl; }

 void (*func3)();

 void test()

 {

  func1 = &func2;//error

  func1 = &C::func2;

  (this->*func1)();

  i3 = &i1;//雖然對於成員函數無法直接取其地址,成員變量可以直接取其地址

 }

public:

 int i1;

 int C::i2;

 int *C::i3;
};

我們想給func3賦值時,但不想用全局函數和類內靜態函數,而想用類成員函數賦值,那麼

func3 = func2//這樣不對,因爲類成員函數單獨使用名字(*func2, &func2, C c, c.func, &(c.func), *(c.func) 都是錯誤的,但全局函數,靜態函數都可以),只能用於函數調用。

c++規定了一個類成員函數指針作爲特殊的函數指針。即:

func1 = &C::func;//正確

對於類變量指針,雖然對於成員函數無法直接取其地址,成員變量可以直接取其地址。同樣類變量指針可以和成員函數指針一樣特殊的定義。

int C::*i1; i1 = &C::i2;

成員函數/變量指針通過.*或->*訪問

調用

c.*func1();//正確

&(c.*func1)//錯誤,因爲指向綁定函數的指針,只能用於函數調用。

c.*i1;//正確

&(c.*i1)//也是正確的

4.(參考)由於成員函數與類綁定(成員函數默認有個參數爲類對象,所以取其指針時候,該函數有個默認的參數沒有直接表明,爲了表明要用A::修飾),那麼取函數指針時,c++規定要顯示註明A::(函數調用不必要)&A::test。如:

#include <iostream>
using namespace std;

class A
{
public:
 void (A::*fun)();
 void test(){ cout << "ok" << endl; }
public:
 void doTest();
};

void A::doTest()
{
 fun=&A::test;
 (this->*fun)();
}
int main()
{
 A a;
 a.doTest();

 &A::test//甚至在外邊也可以訪問到
}

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章