c 函式指標和函式物件

2021-09-16 20:37:36 字數 2054 閱讀 8768

三、函式指標

四、函式物件

博主認為,要想正確深入了解c++中的函式型別和函式指標,就應當首先了解在c++中成員函式在記憶體中的儲存方式。

因此,本文會按照從基礎概念到實際應用,由表及裡的順序撰寫博主對函式指標和函式型別的理解。

c++中的記憶體劃分為以下四個部分:

1)全域性資料區(data area)

2)**區(code area)

3)棧區(stack area)

4)堆區(heap area),即自由儲存區

其中,全域性資料區存放全域性變數、靜態資料和常量【補1】;**區存放類成員函式和非成員函式**;棧區存放為執行函式而分配的區域性變數、函式引數、返回資料、返回位址等;餘下的空間都被稱為堆區。

用類去定義物件時,系統會為每個物件分配儲存空間。如果乙個類包含了資料和函式,要分別為資料和函式的**分配儲存空間。注意,為了節約儲存空間,避免為每個物件重複開闢相同的**區,所以在c++中,每個物件所占用的儲存空間只是該物件的資料部分(虛函式指標和虛基類指標也屬於資料部分)所占用的儲存空間,而不包括函式**所占用的儲存空間。

因此,在類的定義時,類成員函式是放在**區,而類的靜態成員變數在類定義時就已經在全域性資料區分配了記憶體,因而它是屬於類的,對於非靜態成員變數,我們是在類的例項化過程中(構造物件)為其分配記憶體,所以它屬於物件。

另外,再補充類的靜態成員函式和非靜態成員函式的區別:靜態成員函式和非靜態成員函式都是在類的定義時存放在記憶體的**區的,因此可以說他們都是屬於類的,但是因為類的非靜態成員函式都內含了乙個指向類物件的指標型引數(即this指標),因而只有類物件才能呼叫(此時this指標有實際值),所以類只能呼叫靜態成員函式,不能呼叫非靜態成員函式(即使函式沒有引數)

總結:類的成員函式不管是不是靜態的,都不占用物件的儲存空間,都是存放在記憶體的**區,屬於類。

補1:靜態資料和常量的區別:

c++有四種資料成員:

1)常量資料成員 const

2)靜態資料成員static

3)普通資料成員normal

4)靜態常量成員 static const

const定義的常量在超出其作用域之後,其記憶體空間會被釋放。

const資料成員的初始化只能在類的建構函式的初始化列表中進行。要想建立在整個類中都恆定的常量,應該用類的列舉常量或者static const來實現。

const資料成員,只在某個物件生存期內是常量,而對於整個類而言卻是可變的。因為類可以建立多個物件,不同的物件其const資料成員的值可以不同,所以不能在類的宣告中初始化const資料成員,因為類的物件沒被建立時,編譯器不知道const資料成員的值是什麼。

static靜態成員變數不能在類的內部初始化,static定義的靜態常量在函式執行後不會釋放其儲存空間。

static表示的是靜態的。類的靜態成員函式、靜態成員變數是和類相關的,而不是和類的具體物件相關的。即使沒有具體物件,也能呼叫類的靜態成員函式和成員變數。一般類的靜態函式幾乎就是乙個全域性函式,只不過它的作用域限於包含它的檔案。

c++中static成員不能在類的內部初始化。在類的內部只能是宣告,定義必須在類定義體的外部,通常在類的實現檔案中初始化。

函式指標是指向函式位址的指標變數,在c++編譯時,每乙個函式都有乙個入口位址,那麼指向這個函式的函式指標便指向這個位址。

函式指標主要用於呼叫函式和用作函式引數。

宣告方式:

typedef (*函式名)(形參)

int(*add1)(int a, int b);

int(*add2)(int a, int b);

具體的使用方式:

int addfunc(int a, int b)

int main()

最後的結果是5 5

c++函式物件實質上是操作符過載,實現了對()操作符的過載。c++函式物件不是函式指標,但是在程式中,它的呼叫方式與函式指標一樣,後面加個括號就好了。

使用方式是

int addfunc(int a, int b)

class add

};int main()

C 函式指標和函式物件

c 裡有函式指標和函式物件,讓我們來看下這2個的區別 我們在學習c c 時,有時會要寫乙個函式,這個函式的引數是另外乙個函式,一種寫法如下,include using namespace std void test void func int 引數是另外乙個函式 voidfn int data in...

函式指標和函式物件

函式指標分為全域性函式指標和類成員函式指標.函式指標型別為全域性函式.include stdafx.h using namespace std class testaction typedef void fp int void drink int i void eat int i class tes...

C 函式指標和函式物件的總結

轉自 篇一 函式指標 函式指標 是指向函式的指標變數,在c編譯時,每乙個函式都有乙個入口位址,那麼這個指向這個函式的函式指標便指向這個位址。函式指標的用途是很大的,主要有兩個作用 用作呼叫函式和做函式的引數。函式指標的宣告方法 資料型別標誌符 指標變數名 形參列表 一般函式的宣告為 int func...