1. 程式人生 > >C++指向函式的指標

C++指向函式的指標

指標,學習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;
}

指向過載函式的指標必須精確匹配,否則出錯。