C++函數(shù)指針+對(duì)象指針+this指針+指向類(lèi)靜態(tài)和非靜態(tài)成員的指針

1、指向函數(shù)的指針
函數(shù)的代碼在內(nèi)存中的首地址,是由函數(shù)名表示的,也就是說(shuō)函數(shù)名等價(jià)于函數(shù)代碼首地址。因此,可以定義一個(gè)指向函數(shù)的指針,即函數(shù)指針。函數(shù)指針定義和賦值的語(yǔ)法如下,其中數(shù)據(jù)類(lèi)型代表指向函數(shù)的返回類(lèi)型,形參表為指向函數(shù)的形參表;賦值時(shí)必須保證指向的函數(shù)名和函數(shù)指針的返回類(lèi)型和形參完全相同:
數(shù)據(jù)類(lèi)型 (*函數(shù)指針名)(形參表);
函數(shù)指針名 = 函數(shù)名;
下面的例子定義了一個(gè)函數(shù)和一個(gè)函數(shù)指針,通過(guò)函數(shù)指針調(diào)用函數(shù)代碼:
/// 1、預(yù)先定義一個(gè)返回int類(lèi)型的函數(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、對(duì)象指針
顧名思義,對(duì)象指針表示指向?qū)ο蟮闹羔?。?duì)象名即對(duì)象的地址,所以可以將對(duì)象的地址賦值給同類(lèi)型的指針,從而通過(guò)該指針使用此對(duì)象。
定義與使用對(duì)象指針包含4個(gè)步驟:
- 定義XXX類(lèi)型指針;
- 定義XXX類(lèi)型對(duì)象;
- 將對(duì)象地址賦值給指針;
- 使用“(*對(duì)象指針名).成員名”或者“對(duì)象指針名->成員名”的形式使用對(duì)象的成員;
下面的例子展示了對(duì)象指針的定義與使用:
Duck duck(666);
/// 定義并賦值對(duì)象指針
Duck *pointerDuck;
pointerDuck = &duck;
/// 對(duì)象指針采用兩種方式訪問(wèn)對(duì)象的成員
printf("%d \n", (*pointerDuck).getAge());
printf("%d \n", pointerDuck->getAge());3、this指針
C++中,類(lèi)的每個(gè)對(duì)象的數(shù)據(jù)成員都需要單獨(dú)分配內(nèi)存,但是類(lèi)的所有對(duì)象的函數(shù)成員共享內(nèi)存。this指針是對(duì)象的非靜態(tài)成員函數(shù)的隱含參數(shù),不需要自己進(jìn)行定義,this指針指向當(dāng)前調(diào)用非靜態(tài)成員函數(shù)的對(duì)象。當(dāng)類(lèi)對(duì)象調(diào)用非靜態(tài)成員函數(shù)時(shí),對(duì)象的地址作為this指針的值,進(jìn)而非靜態(tài)成員函數(shù)通過(guò)this指向的地址,來(lái)訪問(wèn)對(duì)象的數(shù)據(jù)成員(類(lèi)的不同對(duì)象的數(shù)據(jù)成員存儲(chǔ)在不同的地址,this指針用于傳遞對(duì)象的地址)。
this指針訪問(wèn)其指向的對(duì)象數(shù)據(jù)成員的語(yǔ)法為:
this->數(shù)據(jù)成員名
下面的例子中,Duck類(lèi)的成員函數(shù)getAge需要訪問(wèn)對(duì)象的數(shù)據(jù)成員duckAge,但是由于函數(shù)中已經(jīng)存在同名的duckAge變量,所以需要通過(guò)this來(lái)訪問(wèn)數(shù)據(jù)成員duckAge:
class Duck{
public:
?? ?Duck(int age) { duckAge = age; };
?? ?int getAge() {?
?? ??? ?int duckAge = 3;
? ? ? ? ? ? /// 通過(guò)this訪問(wèn)對(duì)象的數(shù)據(jù)成員duckAge,而不是局部變量duckAge
?? ??? ?return this->duckAge;?
?? ?};
private:
?? ?int duckAge;
};4、指向類(lèi)的非靜態(tài)成員的指針
首先,類(lèi)的靜態(tài)成員和非靜態(tài)成員是不同的,靜態(tài)成員屬于類(lèi),而非靜態(tài)成員屬于對(duì)象。指向類(lèi)的非靜態(tài)成員的指針,包含指向數(shù)據(jù)成員的指針和指向函數(shù)成員的指針。聲明時(shí)需要指明指針指向的“類(lèi)名”和“類(lèi)型”,類(lèi)型表示數(shù)據(jù)成員或函數(shù)成員的數(shù)據(jù)類(lèi)型:
類(lèi)型 類(lèi)名::*數(shù)據(jù)成員指針名;
類(lèi)型 (類(lèi)名::*函數(shù)成員指針名)(參數(shù)表);
下面定義的Duck類(lèi)包含public成員:int類(lèi)型數(shù)據(jù)成員duckWeight和int類(lèi)型函數(shù)成員getAge()(指向非靜態(tài)成員的指針也必須遵守訪問(wèn)權(quán)限,不能指向private成員)下面分別聲明指向二者的指針:
int Duck::*pointerDuckWeight; int (Duck::*pointerGetAge)();
指向非靜態(tài)成員的數(shù)據(jù)指針和函數(shù)指針賦值語(yǔ)法為:
數(shù)據(jù)成員指針名 = &類(lèi)名::數(shù)據(jù)成員名;
函數(shù)成員指針名 = &類(lèi)名::函數(shù)成員名;
下面對(duì)兩個(gè)指針進(jìn)行賦值:
pointerDuckWeight = &Duck::duckWeight; pointerGetAge = &Duck::getAge;
上面進(jìn)行的聲明和賦值都是針對(duì)類(lèi)進(jìn)行的,所以并沒(méi)有指向?qū)ο蟮某蓡T地址。這里涉及到類(lèi)的定義過(guò)程,類(lèi)定義時(shí)并沒(méi)有分配內(nèi)存,而只是確定各個(gè)數(shù)據(jù)成員所占內(nèi)存大小和相對(duì)位置。所以,可以使用對(duì)象的起始地址加相對(duì)位置對(duì)數(shù)據(jù)成員進(jìn)行訪問(wèn)。非靜態(tài)數(shù)據(jù)成員指針訪問(wèn)成員的語(yǔ)法有如下兩種方式:
對(duì)象名.*數(shù)據(jù)成員的指針名
對(duì)象指針名->*數(shù)據(jù)成員指針名
/// 調(diào)用例子
printf("%d \n", duck.*pointerDuckWeight);函數(shù)成員并不針對(duì)每個(gè)對(duì)象都有一個(gè)副本,而是共享的。對(duì)象調(diào)用函數(shù)成員時(shí)需要通過(guò)this指針,非靜態(tài)成員函數(shù)指針的調(diào)用包含下面兩種語(yǔ)法:
(對(duì)象名.函數(shù)成員指針名)(實(shí)參表)
(對(duì)象指針名->*函數(shù)成員指針名 )(實(shí)參表)
/// 實(shí)際調(diào)用的例子
printf("%d \n", (duck.*pointerGetAge)());5、指向類(lèi)的靜態(tài)成員的指針
對(duì)于類(lèi)的靜態(tài)數(shù)據(jù)成員和函數(shù)成員,由于其并不屬于具體的對(duì)象,所以只需要普通的數(shù)據(jù)型指針和函數(shù)型指針即可。
下面定義的Duck類(lèi)包含用static聲明的靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員:
class Duck{
public:
?? ?static int getAge() {?
?? ??? ?return 666;
?? ?};
?? ?static int duckWeight;
};
int Duck::duckWeight = 333;下面是指向類(lèi)的靜態(tài)成員的數(shù)據(jù)型指針和函數(shù)型指針的定義和賦值過(guò)程:
int *pointerDuckWeight; int (*pointerGetAge)(); /// 賦值語(yǔ)法:指針名=&類(lèi)名:靜態(tài)成員名 pointerDuckWeight = &Duck::duckWeight; pointerGetAge = &Duck::getAge;
調(diào)用指針的時(shí)候,只需要遵守基本數(shù)據(jù)型指針和函數(shù)型指針的調(diào)用語(yǔ)法即可:
printf("%d \n", *pointerDuckWeight);
printf("%d \n", (*pointerGetAge)());到此這篇關(guān)于C++函數(shù)指針+對(duì)象指針+this指針+指向類(lèi)靜態(tài)和非靜態(tài)成員的指針的文章就介紹到這了,更多相關(guān)C++指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++類(lèi)與對(duì)象深入之構(gòu)造函數(shù)與析構(gòu)函數(shù)詳解
- C++類(lèi)和對(duì)象之類(lèi)的6個(gè)默認(rèn)成員函數(shù)詳解
- C++類(lèi)與對(duì)象深入之引用與內(nèi)聯(lián)函數(shù)與auto關(guān)鍵字及for循環(huán)詳解
- C++簡(jiǎn)單又輕松的講解類(lèi)和對(duì)象中友元函數(shù)
- C++分析類(lèi)的對(duì)象作類(lèi)成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員
- C++類(lèi)與對(duì)象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解
相關(guān)文章
基于C++實(shí)現(xiàn)高精度計(jì)時(shí)器
chrono是C++ 11中的時(shí)間庫(kù),它提供了跨平臺(tái)的高精度時(shí)鐘解決方案,精確到納秒級(jí),本文主要為大家詳細(xì)介紹了如何使用chrono實(shí)現(xiàn)高精度計(jì)時(shí)器,感興趣的可以了解下2024-02-02
C++用指針變量作為函數(shù)的參數(shù)接受數(shù)組的值的問(wèn)題詳細(xì)總結(jié)
以下是對(duì)C++中用指針變量作為函數(shù)的參數(shù)接受數(shù)組的值的問(wèn)題進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++模板以及實(shí)現(xiàn)vector實(shí)例詳解
模板是為了實(shí)現(xiàn)泛型編程,所謂泛型編程,就是指編寫(xiě)與類(lèi)型無(wú)關(guān)的代碼,下面這篇文章主要給大家介紹了關(guān)于C++模板以及實(shí)現(xiàn)vector的相關(guān)資料,需要的朋友可以參考下2021-11-11
VC++實(shí)現(xiàn)輸出GIF到窗體并顯示GIF動(dòng)畫(huà)的方法
這篇文章主要介紹了VC++實(shí)現(xiàn)輸出GIF到窗體并顯示GIF動(dòng)畫(huà)的方法,需要的朋友可以參考下2014-07-07
結(jié)合C++11的新特性來(lái)解析C++中的枚舉與聯(lián)合
這篇文章主要介紹了C++編程中的枚舉與聯(lián)合,結(jié)合了范圍(或強(qiáng)類(lèi)型)enum class類(lèi)型等C++11的新特性來(lái)講解,需要的朋友可以參考下2016-01-01
C++ inline內(nèi)聯(lián)函數(shù)詳解
這篇文章主要介紹了C++ inline內(nèi)聯(lián)函數(shù)詳解,有感興趣的同學(xué)可以借鑒參考下2021-02-02

