//成員函式指標
#include using namespace std;
//全域性函式
void test ()
void test2 (int a)
//結構體
struct date
//有參
void show2(int a,int b)
//無參
void showyear()
int add()
int sub()
};//這樣相當於間接呼叫了
void addfunc(date d)
void subfunc(date d)
typedef int (date::*func3)();//返回值是int 引數為空的成員函式指標的別名
void setfunc(date d,func3 f)
//這是給int型別起別名 叫做 t
typedef int t;
//給函式指標起別名
typedef void (*func)(int); //注意 這和int的起別名不一樣 這個整體void (*)(int)是型別 ,func是這個型別的別名 其實和int的別名還是一樣的原理,只是不支援那種格式 typedef void (*)(int) func; //不支援這種語法
//給成員函式指標起別名
typedef void (date::*func2)(); //這個指標 只要是date這個類裡面的 沒有返回值 也沒有引數的 成員函式 都可以指向
//主函式
int main();
//通過物件 呼叫 成員函式指標 訪問到 成員函式
cout << "物件 呼叫 成員函式 是點.語法" << endl;
d.show();
cout << "那麼通過 函式指標 呼叫 成員函式 如何??" << endl;
//d.*funct();//這裡有優先順序問題 把後面看乙個整體了funct()
(d.*funct)();
cout << "***************==" << endl;
#pragma 通過別名宣告的 無參的成員函式指標
func2 fb;
fb = &date::showyear; //在這裡也可以讓前面定義的 funct指向showyear 因為是指標
(d.*fb)();
cout << "***************==" << endl;
#pragma 宣告有參的 成員函式指標
//返回值型別 (類名::成員函式指標變數名)(引數)
void (date::*funct2)(int,int);
funct2 = &date::show2;//取成員函式位址
//呼叫
(d.*funct2)(100,200);
//應用場景
//有兩個成員方法 add sub 可以通過結構體物件去呼叫可以實現邏輯 ,但是我不想在main方法裡面呼叫,所以在外面定義乙個全域性函式來包裝
addfunc(d);
subfunc(d);
/*問題來了,如果我有加減乘除求餘等等很多方法 那豈不是要寫很多個全域性函式?
現在我要把這兩個方法封裝成乙個方法 ,它們不同之處在於呼叫的方法不一樣
*/cout << "成員函式指標的應用場景" << endl;
setfunc(d, &date::sub);
/*我還是覺得這樣麻煩 傳引數每次都要帶 &date::
可以用巨集替換 巨集函式
*/cout << "巨集替換之後的成員函式指標的應用場景" << endl;
#define selector(set) (&date::set) //set是巨集引數
setfunc(d, selector(add));
return 0;
}
指標陣列的應用場景
1.做選單 define crt secure no warnings include include include 求關鍵字在表中的位置 乙個入口,多個出口 void searchkeytable const char table,const int size,const char key,in...
指標陣列的應用場景之main函式
include stdio.h include string.h include stdlib.h include include 演示 指標陣列的用法 演示 找錯誤 注意return 求關鍵字在表中的位置 乙個入口 多個出口 int searchekeytable const char table...
C 成員函式指標的應用
原文出處 c 中,成員指標是最為複雜的語法結構。但在事件驅動和多執行緒應用中被廣泛用於呼叫回叫函式。在多執行緒應用中,每個執行緒都通過指向成員函式的指標來呼叫該函式。在這樣的應用中,如果不用成員指標,程式設計是非常困難的。剛遇到這種語法時也許會讓你止步不前。但你會發現,使用恰當的型別定義之後,複雜的...