溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++函數(shù)指針,對象指針,this指針,指向類靜態(tài)怎么用

發(fā)布時間:2022-03-10 14:23:52 來源:億速云 閱讀:108 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了C++函數(shù)指針,對象指針,this指針,指向類靜態(tài)怎么用的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++函數(shù)指針,對象指針,this指針,指向類靜態(tài)怎么用文章都會有所收獲,下面我們一起來看看吧。

C++函數(shù)指針,對象指針,this指針,指向類靜態(tài)怎么用

1、指向函數(shù)的指針

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

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

下面的例子定義了一個函數(shù)和一個函數(shù)指針,通過函數(shù)指針調(diào)用函數(shù)代碼:

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

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

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

2、對象指針

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

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

  • 定義XXX類型指針;

  • 定義XXX類型對象;

  • 將對象地址賦值給指針;

  • 使用“(*對象指針名).成員名”或者“對象指針名->成員名”的形式使用對象的成員;

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

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

3、this指針

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

this指針訪問其指向的對象數(shù)據(jù)成員的語法為:

this->數(shù)據(jù)成員名

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

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

4、指向類的非靜態(tài)成員的指針

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

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

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

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

指向非靜態(tài)成員的數(shù)據(jù)指針和函數(shù)指針賦值語法為:

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

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

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

對象名.*數(shù)據(jù)成員的指針名
對象指針名->*數(shù)據(jù)成員指針名

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

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

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

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

5、指向類的靜態(tài)成員的指針

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

下面定義的Duck類包含用static聲明的靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員:

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

下面是指向類的靜態(tài)成員的數(shù)據(jù)型指針和函數(shù)型指針的定義和賦值過程:

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

調(diào)用指針的時候,只需要遵守基本數(shù)據(jù)型指針和函數(shù)型指針的調(diào)用語法即可:

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

關(guān)于“C++函數(shù)指針,對象指針,this指針,指向類靜態(tài)怎么用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“C++函數(shù)指針,對象指針,this指針,指向類靜態(tài)怎么用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI