C++指向函式的指標
阿新 • • 發佈:2019-01-03
指標,學習C和C++的人都十分了解,但是很多人都十分懼怕指標,沒關係,今天我們學習指向函式的指標。
舉例說明
#include<iostream> #include<string> using namespace std; bool lengthCompare(const string &s1,const string &s2) { return s1.size() == s2.size(); } int main() { //pf是一個指標,指向函式的指標。 //pf是一個區域性變數。 bool (*pf)(const string &,const string &); pf = &lengthCompare; // pf = lengthCompare;//這種也可以 ,因為函式的名稱就在指向地址的指標 cout << lengthCompare("Hello","ASIA") << endl;; cout << (*pf)("Hello","ASIA") << endl; cout << pf("Hello","ASIA") << endl; return 0; }
bool (*pf)(const string &,const string &),好比定義一個變數,只是它是指向函式的指標。
結果如下:
我們這樣定義變數的話,如果需要定義多個,就會非常麻煩,所以,我們採取型別定義的方法,來解決這個問題。
//使用型別定義,定義一個函式指標
typedef bool (*comPar)(const string &,const string &);
完整程式碼如下:
#include<iostream> #include<string> using namespace std; //使用型別定義,定義一個函式指標 typedef bool (*comPar)(const string &,const string &); bool lengthCompare(const string &s1,const string &s2) { return s1.size() == s2.size(); } int main() { //pf是一個指標,指向函式的指標。 //pf是一個區域性變數。 bool (*pf)(const string &,const string &); comPar pf2; pf2 = lengthCompare; pf = &lengthCompare; // pf = lengthCompare;//這種也可以 ,因為函式的名稱就在指向地址的指標 cout << lengthCompare("Hello","ASIA") << endl;; cout << (*pf)("Hello","ASIA") << endl; cout << pf("Hello","ASIA") << endl; cout << pf2("Hello","ASIA") << endl; return 0; }
如果我們定義一個函式,除了返回型別不同,其他都一樣,我們看看會出現什麼情況。
定義一個函式:
string::size_type sumLength(const string &s1,const string &s2)
{
return s1.size() + s2.size();
}
完整如下:
#include<iostream> #include<string> using namespace std; //使用型別定義,定義一個函式指標 typedef bool (*comPar)(const string &,const string &); bool lengthCompare(const string &s1,const string &s2) { return s1.size() == s2.size(); } string::size_type sumLength(const string &s1,const string &s2) { return s1.size() + s2.size(); } int main() { comPar pf3; pf3 = sumLength; cout << pf3("Hello","ASIA") << endl; return 0; }
出錯,因為型別定義與其不符。
函式指標做形參
#include<iostream>
#include<string>
using namespace std;
//使用型別定義,定義一個函式指標
typedef bool (*comPar)(const string &,const string &);
bool lengthCompare(const string &s1,const string &s2)
{
return s1.size() == s2.size();
}
void useBigger(const string &s1,const string &s2,bool (*pf)(const string &,const string &))
{
cout << pf(s1,s2) << endl;;
}
int main()
{
comPar pf2;
pf2 = lengthCompare;
useBigger("Hello","ASIA",pf2);
useBigger("Hello","ASIA",lengthCompare);
return 0;
}
這個非常有意思,指向函式的指標可以做形參。
#include<iostream>
#include<string>
using namespace std;
int demo(int *x,int y)
{
cout << "demo" <<endl;
return 16;
}
//ff是一個函式,有一個形參x返回結果是一個函式指標int(*)(int*,int)
int (*ff(int x))(int *,int )
{
cout << x <<endl;
return demo;
}
int main()
{
int a = 3;
cout << ff(4)(&a,a) << endl;
return 0;
}
當然這看起來比較複雜,我們採用型別定義。如下:
#include<iostream>
#include<string>
using namespace std;
typedef int (*PF)(int *,int );
int demo(int *x,int y)
{
cout << "demo" <<endl;
return 16;
}
//ff是一個函式,有一個形參x返回結果是一個函式指標int(*)(int*,int)
PF ff(int x)
//int (*ff(int x))(int *,int )
{
cout << x <<endl;
return demo;
}
int main()
{
int a = 3;
cout << ff(4)(&a,a) << endl;
return 0;
}
指向過載函式的指標
#include<iostream>
#include<string>
using namespace std;
void demo(double x)
{
cout << "demo(double x)" <<endl;
}
void demo(unsigned int x)
{
cout << "demo(unsigned int x)" << endl;
}
int main()
{
//void (*pf)(int) = &demo;
void (*pf)(double) = &demo;
return 0;
}
指向過載函式的指標必須精確匹配,否則出錯。