程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++成員函數指針詳細使用指南

C++成員函數指針詳細使用指南

編輯:C++入門知識

我們曾經在一篇文章中為大家詳細介紹了有關C++函數指針的相關問題,那麼今天大家將會進一步對這方面的知識有一個充分的掌握。在C++程序中,很多函數是成員函數,即這些函數是某個類中的一部分。你不可以像一個普通的函數指針那樣指向一個成員函數,正確的做法應該是,你必須使用一個成員函數指針。一個成員函數的指針指向類中的一個成員函數,並和以前有相同的參數,聲明如下:

  1. float (SomeClass::*my_memfunc_ptr)(int, char *); 

對於使用const關鍵字修飾的成員函數,聲明如下:

  1. float (SomeClass::*my_const_memfunc_ptr)(int, char *) const; 

  • C++ const變量使用技巧總結
  • C++ static關鍵字詳細應用指南
  • C++ Cstring應用方法概述
  • C++ typeof基本應用方式解析
  • C++訪問控制符內容相關介紹
注意使用了特殊的運算符::*),而“SomeClass”是聲明中的一部分。C++成員函數指針有一個可怕的限制:它們只能指向一個特定的類中的成員函數。對每一種參數的組合,需要有不同的成員函數指針類型,而且對每種使用const修飾的函數和不同類中的函數,也要有不同的函數指針類型。在MSVC中,對下面這四種調用方式都有一種不同的調用類型:

__cdecl, __stdcall, __fastcall, 和 __thiscall。

__thiscall是缺省的方式,有趣的是,在任何官方文檔中從沒有對__thiscall關鍵字的詳細描述,但是它經常在錯誤信息中出現。如果你顯式地使用它,你會看到“它被保留作為以後使用it is reserved for future use)”的錯誤提示。)

如果你使用了C++成員函數指針,你最好使用typedef以防止混淆。將函數指針指向型如float SomeClass::some_member_func(int, char *)的函數,你可以這樣寫:

  1. my_memfunc_ptr = &SomeClass::some_member_func; 

很多編譯器比如MSVC)會讓你去掉“&”,而其他一些編譯器比如GNU G++)則需要添加“&”,所以在手寫程序的時候我建議把它添上。若要調用成員函數指針,你需要先建立SomeClass的一個實例,並使用特殊操作符“->*”,這個操作符的優先級較低,你需要將其適當地放入圓括號內。

  1. SomeClass *x = new SomeClass;  
  2. (x->*my_memfunc_ptr)(6, "Another Arbitrary Parameter"); 

如果類在棧上,你也可以使用“.*”運算符。

  1. SomeClass y;  
  2. (y.*my_memfunc_ptr)(15, "Different parameters this time"); 

不要怪我使用如此奇怪的語法——看起來C++的設計者對標點符號有著由衷的感情!C++相對於C增加了三種特殊運算符來支持成員指針。“::*”用於指針的聲明,而“->*”和“.*”用來調用指針指向的函數。這樣看起來對一個語言模糊而又很少使用的部分的過分關注是多余的。你當然可以重載“->*”這些運算符,但這不是本文所要涉及的范圍。)

一個C++成員函數指針可以被設置成0,並可以使用“==”和“!=”比較運算符,但只能限定在同一個類中的成員函數的指針之間進行這樣的比較。任何成員函數指針都可以和0做比較以判斷它是否為空。與函數指針不同,不等運算符<, >, <=, >=)對C++成員函數指針是不可用的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved