C++函數指針+對象指針+this指針+指向類靜態和非靜態成員的指針

 更新時間:2022年03月10日 11:50:49   作者:機器學習入坑者  
這篇文章主要介紹了C++函數指針+對象指針+this指針+指向類靜態和非靜態成員的指針,函數指針定義和賦值的語法指其中數據類型代表指向函數的返回類型,形參表為指向函數的形參表,更多相關資料需要的朋友可以參考一下下面文章內容

1、指向函數的指針

函數的代碼在內存中的首地址,是由函數名表示的,也就是說函數名等價于函數代碼首地址。因此,可以定義一個指向函數的指針,即函數指針。函數指針定義和賦值的語法如下,其中數據類型代表指向函數的返回類型,形參表為指向函數的形參表;賦值時必須保證指向的函數名和函數指針的返回類型和形參完全相同:

數據類型 (*函數指針名)(形參表);
函數指針名 = 函數名;

下面的例子定義了一個函數和一個函數指針,通過函數指針調用函數代碼:

/// 1、預先定義一個返回int類型的函數
int addOne(int x) {
?? ?x = x + 1;
?? ?return x;
}

/// 2、定義并賦值函數指針
int (*pointerAddOne)(int x);
pointerAddOne = addOne;

/// 3、使用函數指針和使用函數名的方式相同
data = pointerAddOne(data);

2、對象指針

顧名思義,對象指針表示指向對象的指針。對象名即對象的地址,所以可以將對象的地址賦值給同類型的指針,從而通過該指針使用此對象。

定義與使用對象指針包含4個步驟:

  • 定義XXX類型指針;
  • 定義XXX類型對象;
  • 將對象地址賦值給指針;
  • 使用“(*對象指針名).成員名”或者“對象指針名->成員名”的形式使用對象的成員;

下面的例子展示了對象指針的定義與使用:

Duck duck(666);
/// 定義并賦值對象指針
Duck *pointerDuck;
pointerDuck = &duck;
/// 對象指針采用兩種方式訪問對象的成員
printf("%d \n", (*pointerDuck).getAge());
printf("%d \n", pointerDuck->getAge());

3、this指針

C++中,類的每個對象的數據成員都需要單獨分配內存,但是類的所有對象的函數成員共享內存。this指針是對象的非靜態成員函數的隱含參數,不需要自己進行定義,this指針指向當前調用非靜態成員函數的對象。當類對象調用非靜態成員函數時,對象的地址作為this指針的值,進而非靜態成員函數通過this指向的地址,來訪問對象的數據成員(類的不同對象的數據成員存儲在不同的地址,this指針用于傳遞對象的地址)。

this指針訪問其指向的對象數據成員的語法為:

this->數據成員名

下面的例子中,Duck類的成員函數getAge需要訪問對象的數據成員duckAge,但是由于函數中已經存在同名的duckAge變量,所以需要通過this來訪問數據成員duckAge

class Duck{
public:
?? ?Duck(int age) { duckAge = age; };
?? ?int getAge() {?
?? ??? ?int duckAge = 3;
? ? ? ? ? ? /// 通過this訪問對象的數據成員duckAge,而不是局部變量duckAge
?? ??? ?return this->duckAge;?
?? ?};
private:
?? ?int duckAge;
};

4、指向類的非靜態成員的指針

首先,類的靜態成員和非靜態成員是不同的,靜態成員屬于類,而非靜態成員屬于對象。指向類的非靜態成員的指針,包含指向數據成員的指針和指向函數成員的指針。聲明時需要指明指針指向的“類名”和“類型”,類型表示數據成員或函數成員的數據類型:

類型 類名::*數據成員指針名;
類型 (類名::*函數成員指針名)(參數表);

下面定義的Duck類包含public成員:int類型數據成員duckWeight和int類型函數成員getAge()(指向非靜態成員的指針也必須遵守訪問權限,不能指向private成員)下面分別聲明指向二者的指針:

int Duck::*pointerDuckWeight;
int (Duck::*pointerGetAge)();

指向非靜態成員的數據指針和函數指針賦值語法為:

數據成員指針名 = &類名::數據成員名;
函數成員指針名 = &類名::函數成員名;
下面對兩個指針進行賦值:

pointerDuckWeight = &Duck::duckWeight;
pointerGetAge = &Duck::getAge;

上面進行的聲明和賦值都是針對類進行的,所以并沒有指向對象的成員地址。這里涉及到類的定義過程,類定義時并沒有分配內存,而只是確定各個數據成員所占內存大小和相對位置。所以,可以使用對象的起始地址加相對位置對數據成員進行訪問。非靜態數據成員指針訪問成員的語法有如下兩種方式:

對象名.*數據成員的指針名
對象指針名->*數據成員指針名

/// 調用例子
printf("%d \n", duck.*pointerDuckWeight);

函數成員并不針對每個對象都有一個副本,而是共享的。對象調用函數成員時需要通過this指針,非靜態成員函數指針的調用包含下面兩種語法:

(對象名.函數成員指針名)(實參表)
(對象指針名->*函數成員指針名 )(實參表)

/// 實際調用的例子
printf("%d \n", (duck.*pointerGetAge)());

5、指向類的靜態成員的指針

對于類的靜態數據成員和函數成員,由于其并不屬于具體的對象,所以只需要普通的數據型指針和函數型指針即可。

下面定義的Duck類包含用static聲明的靜態數據成員和靜態函數成員:

class Duck{
public:
?? ?static int getAge() {?
?? ??? ?return 666;
?? ?};
?? ?static int duckWeight;
};
int Duck::duckWeight = 333;

下面是指向類的靜態成員的數據型指針和函數型指針的定義和賦值過程:

int *pointerDuckWeight;
int (*pointerGetAge)();
/// 賦值語法:指針名=&類名:靜態成員名
pointerDuckWeight = &Duck::duckWeight;
pointerGetAge = &Duck::getAge;

調用指針的時候,只需要遵守基本數據型指針和函數型指針的調用語法即可:

printf("%d \n", *pointerDuckWeight);
printf("%d \n", (*pointerGetAge)());

到此這篇關于C++函數指針+對象指針+this指針+指向類靜態和非靜態成員的指針的文章就介紹到這了,更多相關C++指針內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 帶你了解C++中的sort函數

    帶你了解C++中的sort函數

    這篇文章主要給大家介紹了關于C++中sort函數的基礎入門使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2021-08-08
  • C++獲取類的成員函數的函數指針詳解及實例代碼

    C++獲取類的成員函數的函數指針詳解及實例代碼

    這篇文章主要介紹了C++獲取類的成員函數的函數指針詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-02-02
  • 將CString字符串輸入轉化成整數的實現方法

    將CString字符串輸入轉化成整數的實現方法

    下面小編就為大家帶來一篇將CString字符串輸入轉化成整數的實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • C++獲取項目路徑的兩種方式詳解

    C++獲取項目路徑的兩種方式詳解

    這篇文章主要介紹了C++獲取項目路徑的兩種方式的相關資料,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • c語言左移和右移的示例詳解

    c語言左移和右移的示例詳解

    這篇文章主要介紹了c語言左移和右移的示例詳解,移位操作符的兩個操作數必須是整型的。整個移位表達式的值的類型也是整型的,而且,左移位操作符與右移位操作符的運算并不對稱。
    2020-07-07
  • C語言指針入門的簡單實例教程

    C語言指針入門的簡單實例教程

    這篇文章主要給大家介紹了關于C語言指針入門的簡單實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • DSP中浮點轉定點運算--定點數模擬浮點數運算及常見的策略

    DSP中浮點轉定點運算--定點數模擬浮點數運算及常見的策略

    本文主要講解DSP中定點數模擬浮點數運算及常見的策略,具有參考價值,需要的朋友可以參考一下。
    2016-06-06
  • C語言中scanf函數與空格回車的用法說明

    C語言中scanf函數與空格回車的用法說明

    這篇文章主要介紹了C語言中scanf函數與空格回車的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 利用c++寫一個簡單的推箱子小游戲

    利用c++寫一個簡單的推箱子小游戲

    推箱子想必是很多人童年時期的經典游戲,我們依舊能記得抱個老人機娛樂的場景,下面這篇文章主要給大家介紹了關于如何利用c++寫一個簡單的推箱子小游戲的相關資料,需要的朋友可以參考下
    2021-09-09
  • 詳解C++編程中的輸入輸相關的類和對象

    詳解C++編程中的輸入輸相關的類和對象

    這篇文章主要介紹了詳解C++編程中的輸入輸相關的類和對象,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09

最新評論

免费人成视频在线观看