函式指標以及成員函式指標_成員變數指標
這篇是為了加深記憶所寫。發現,很多知識若不經過反覆的琢磨和動手實踐,是很難記得住的。
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定義函式型別,這種寫法有助於對程式碼的理解:
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&, const3 //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)