1. 程式人生 > >函式指標以及成員函式指標_成員變數指標

函式指標以及成員函式指標_成員變數指標

這篇是為了加深記憶所寫。發現,很多知識若不經過反覆的琢磨和動手實踐,是很難記得住的。

1)  函式指針的初始化

函式如下:

1 int CompareString(const string& str1, const string& str2)
2 {
3     return str1.compare(str2);  

4 }

函式的初始化有兩種方式:

第一種,也是最普遍的方式:

1 int (*CompareFunction)(const string&, const string&) = CompareString;

第二種,是使用typedef定義函式型別,這種寫法有助於對程式碼的理解:

1 typedef int (*CompareFunctionType)(const string&, const string&);2 CompareFunctionType CompareFunction = CompareString;

2)  函式指標賦值。

函式名可以理解為該型別函式的指標。當然,取地址操作符作用於函式名上也能產生指向該型別函式的指標。也就是說下面兩種賦值都是可行的:

1 CompareFunctionType CompareFunction = CompareString;
2 CompareFunctionType CompareFunction = &CompareString;

3)  函式呼叫。

無論是用函式名呼叫,還是用函式指標呼叫,還是用顯式的指標符號呼叫,其寫法是一樣的:

1 CompareString("abc""cba");
2 CompareFunction("abc""cba");
3 (*CompareFunction)("abc""cba");

4)  函式指標的陣列。

對於函式指標的陣列,強烈建議使用typedef方式定義型別之後再使用,不然影響程式碼的閱讀性,繼續以以上例子為例:

1 //without typedef2 int (*CompareFunctionArray[3])(const string&, const
 string&);
3 //with typedef4 CompareFunctionType CompareFunctionTypeArray[3];

5)  函式指標用做函式返回值的型別。

到這一步,會發現typedef是多麼的好用了。不然我是完全讀不懂下面語句的意思的:

1 //without typedef2 int (*func(int*, int))(const string&, const string&);

上面的宣告,將func(int*, int)宣告為一個函式,返回值為函式指標,函式型別為int (*)(const string&, const string&)。

多麼的晦澀啊!

如果寫成typedef就不用這麼糾結了,足見typedef的作用:

1 CompareFunctionType func(int*, int);

6)  指向extern "C"函式的指標。

《C++ primer 3》中有指出,指向C函式的指標和指向C++函式的指標型別不同,但是現在的很多編譯器都有語言擴充套件,認為這兩種函式的指標具有相同的特性。

所以,我在vs 2010中做了嘗試,結果證明是支援這種語言擴充套件的。

函式宣告如下:

複製程式碼 1 extern "C" int InsideFunctionC(const string& str1, const string& str2)
2 {
3     return str1.compare(str2);
4 }
5 
6 int InsideFunctionCPlusPlus(const string& str1, const string& str2)
7 {
8     return str1.compare(str2); 

9 }

複製程式碼

函式指標的初始化和呼叫,允許賦值為指向C函式的指標:

1 int (*CompareFunction)(const string&, const string&) = InsideFunctionC;

另外還有一點,當extern "C"應用在一個宣告上時,所有被它宣告的函式都將受到影響。舉個例子:

1 extern "C" void OutSideFunction(int (*fc)(const string&, const string&))
2 {
3     cout<<fc("abc""cba")<<endl;;
4 }

這裡的OutSideFunction和fc都將受到extern "C"的影響,但是vs2010編譯器是支援一個指向C++函式的指標作為OutSideFunction的引數。如下:

複製程式碼 1 int main()
2 {
3     OutSideFunction(InsideFunctionC);
4     OutSideFunction(InsideFunctionCPlusPlus);
5     
6     return 0

7 }

複製程式碼

到此就差不多了。昨天看了一遍,今天又寫部落格溫習了一遍,應該算是加深記憶了。傻笑一個。

相關推薦

C++ 虛擬函式指標以及虛擬函式指標的確定

【摘要】 很多教材上都有介紹到虛指標、虛擬函式與虛擬函式表,有的說類物件共享一個虛擬函式表,有的說,一個類物件擁有一個虛擬函式表;還有的說,無論使用者聲明瞭多少個類物件,但是,這個VTABLE虛擬函式表只有一個;也有的在說,每個具有虛擬函式的類的物件裡面都有一

python隱函式畫圖以及匿名函式lambda使用.md

python隱函式畫圖以及匿名函式lambda使用 一.匿名函式lambda使用 因為一會畫隱函式畫圖想用一下lambda匿名函式,所以就在這裡學習一下其用法,本質上來講lambda就是把函式換了中說法,其應用場景可以用在一些簡單函式的定義上,比如你想定義一個比較大小的函式,而該

自己定義一個加減乘除函式以及lambda函式的用法

使用lambda函式實現一個加減乘除函式的定義 def calc(num_list, fn): result = num_list[0] for index in range(1, len(num_list)): resul

js中函式宣告與函式表示式以及匿名函式的理解

在JS的學習中遇到一些JS函式宣告的問題,找了一些資料學習之後,有了自己的一些初步的認識。 首先,瞭解函式宣告,函式宣告:就是使用關鍵字function,與指定的某個欄位組成函式,作為函式宣告。例如: function funName(){ // }這就是簡單的函式函式聲明瞭。 接下來就是函式表示式,函

Mysql函式以及date函式的一些操作及用法

    對於mysql和ms sql中提供了大量的對時間處理的函式;因為在實際的查詢操作中很多地方都存在對時間格式話的操作處理,所以這裡就拿mysql來說下如何去處理這些時間   mysql 部分date函式的使用:    

虛擬函式/純虛擬函式以及建構函式不能是虛擬函式原因

1.首先要了解什麼是虛擬函式:      簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛擬函式(實現多型)。          作用:指向基類的指標在操作它的多型類物件時,會根據不同的類物

函式指標以及成員函式指標_成員變數指標

這篇是為了加深記憶所寫。發現,很多知識若不經過反覆的琢磨和動手實踐,是很難記得住的。 1)  函式指針的初始化。 函式如下: 1 int CompareString(const string& str1, const string& str2)2 {3     return str1.co

指向類成員函式指標並非指標

指向類成員函式的指標並非指標 參考<<C++必知必會>>的相關章節 "指向類成員函式的指標",這個術語中包含了"類成員函式"的術語,但是嚴格的說,這裡的成員函式只是指非靜態成員函式,這個術語中還包含了"指標"這個術語,但是嚴格的說,它即不包含地址,行為也不象指標,說

成員函式——“this指標

#include <iostream> class A { static int a; int b; public: //成員函式:有一個隱形的“this”指標 void f1()//A* this { this->b; f2(); } //靜態成員函式//

成員函式過載與函式指標

在有成員函式過載的情況下該如何使用函式指標呢 class l { public: void func(); void func(int, int); }; void l::func() { cout << "func()" << endl; }

C++ 函式指標 指向類成員函式

//A類與B類的定義 class A { public:   void Test()   {     cout << "A::Test()" << endl;   } }; &

C++----空指標訪問成員函式

//空指標訪問成員函式; class Person { public: void show() { cout << "Person show" << endl; } void showage() { cout << m_Age <

c++中指向物件的指標為NULL時可以呼叫物件成員函式

問題貌似有點奇怪,指標都為NULL了怎麼還可使用?但其實不是的,可以看以下程式碼: #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 void

C++雜談 為什麼類的空指標物件可以訪問類某些的成員函式

class TestObject { public: TestObject() { std::cout << “TestObject!” << std::endl; } ~Tes

[C++]空的物件指標可以呼叫成員函式

include using namespace std; class A{ public: void func() { cout << "hahaha" << endl; } int m_num = 1; }; int main() { A* ptr = NULL; A obj;

this指標是允許依靠返回該類物件的引用值來連續呼叫該類的成員函式

#include<iostream> using namespace std; class date { int year; int month; public: date() { year=0; month=0; } date& setyear(int y

this 指標的地址--呼叫成員函式的所在物件的起始地址

#include<iostream> using namespace std; class Test { int x; public: Test(int a){ x=a; } void get_this(); }; void Test:: get_this() { co

筆記八:靜態變數、靜態成員函式函式指標、靜態函式指標

靜態變數 1、靜態變數的儲存方式和生命週期:屬於靜態儲存方式,其儲存空間為記憶體中的靜態資料區,該區域的資料在整個程式的執行期間不會釋放,所以其生命週期為整個程式執行時間段。 2、靜態區域性變數:定義在函式體內的變數。當對靜態區域性變數進行初始化時,只

為什麼 C++ 中成員函式指標是 16 位元組?

當我們討論指標時,通常假設它是一種可以用 void * 指標來表示的東西,在 x86_64 平臺下是 8 個位元組大小。例如,下面是來自 維基百科中關於 x86_64 的文章 的摘錄: Pushes and pops on the stack are always in 8-byte strides

C++類 給結構體成員 函式指標 賦值

myStruct標頭檔案 myStruct.h class CMyClass; struct {  int nFlag;  void (CMyClass::*myinit)(int n);  void (CMyClass::*myopen)(int n,void* arg)