C++函數(shù)指針+對(duì)象指針+this指針+指向類靜態(tài)和非靜態(tài)成員的指針
1、指向函數(shù)的指針
函數(shù)的代碼在內(nèi)存中的首地址,是由函數(shù)名表示的,也就是說(shuō)函數(shù)名等價(jià)于函數(shù)代碼首地址。因此,可以定義一個(gè)指向函數(shù)的指針,即函數(shù)指針。函數(shù)指針定義和賦值的語(yǔ)法如下,其中數(shù)據(jù)類型代表指向函數(shù)的返回類型,形參表為指向函數(shù)的形參表;賦值時(shí)必須保證指向的函數(shù)名和函數(shù)指針的返回類型和形參完全相同:
數(shù)據(jù)類型 (*函數(shù)指針名)(形參表);
函數(shù)指針名 = 函數(shù)名;
下面的例子定義了一個(gè)函數(shù)和一個(gè)函數(shù)指針,通過(guò)函數(shù)指針調(diào)用函數(shù)代碼:
/// 1、預(yù)先定義一個(gè)返回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、對(duì)象指針
顧名思義,對(duì)象指針表示指向?qū)ο蟮闹羔槨?duì)象名即對(duì)象的地址,所以可以將對(duì)象的地址賦值給同類型的指針,從而通過(guò)該指針使用此對(duì)象。
定義與使用對(duì)象指針包含4個(gè)步驟:
- 定義XXX類型指針;
- 定義XXX類型對(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++中,類的每個(gè)對(duì)象的數(shù)據(jù)成員都需要單獨(dú)分配內(nèi)存,但是類的所有對(duì)象的函數(shù)成員共享內(nèi)存。this指針是對(duì)象的非靜態(tài)成員函數(shù)的隱含參數(shù),不需要自己進(jìn)行定義,this指針指向當(dāng)前調(diào)用非靜態(tài)成員函數(shù)的對(duì)象。當(dāng)類對(duì)象調(diào)用非靜態(tài)成員函數(shù)時(shí),對(duì)象的地址作為this指針的值,進(jìn)而非靜態(tài)成員函數(shù)通過(guò)this指向的地址,來(lái)訪問(wèn)對(duì)象的數(shù)據(jù)成員(類的不同對(duì)象的數(shù)據(jù)成員存儲(chǔ)在不同的地址,this指針用于傳遞對(duì)象的地址)。
this指針訪問(wèn)其指向的對(duì)象數(shù)據(jù)成員的語(yǔ)法為:
this->數(shù)據(jù)成員名
下面的例子中,Duck類的成員函數(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、指向類的非靜態(tài)成員的指針
首先,類的靜態(tài)成員和非靜態(tài)成員是不同的,靜態(tài)成員屬于類,而非靜態(tài)成員屬于對(duì)象。指向類的非靜態(tài)成員的指針,包含指向數(shù)據(jù)成員的指針和指向函數(shù)成員的指針。聲明時(shí)需要指明指針指向的“類名”和“類型”,類型表示數(shù)據(jù)成員或函數(shù)成員的數(shù)據(jù)類型:
類型 類名::*數(shù)據(jù)成員指針名;
類型 (類名::*函數(shù)成員指針名)(參數(shù)表);
下面定義的Duck類包含public成員:int類型數(shù)據(jù)成員duckWeight和int類型函數(shù)成員getAge()(指向非靜態(tài)成員的指針也必須遵守訪問(wèn)權(quán)限,不能指向private成員)下面分別聲明指向二者的指針:
int Duck::*pointerDuckWeight; int (Duck::*pointerGetAge)();
指向非靜態(tài)成員的數(shù)據(jù)指針和函數(shù)指針賦值語(yǔ)法為:
數(shù)據(jù)成員指針名 = &類名::數(shù)據(jù)成員名;
函數(shù)成員指針名 = &類名::函數(shù)成員名;
下面對(duì)兩個(gè)指針進(jìn)行賦值:
pointerDuckWeight = &Duck::duckWeight; pointerGetAge = &Duck::getAge;
上面進(jìn)行的聲明和賦值都是針對(duì)類進(jìn)行的,所以并沒(méi)有指向?qū)ο蟮某蓡T地址。這里涉及到類的定義過(guò)程,類定義時(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、指向類的靜態(tài)成員的指針
對(duì)于類的靜態(tài)數(shù)據(jù)成員和函數(shù)成員,由于其并不屬于具體的對(duì)象,所以只需要普通的數(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ù)型指針的定義和賦值過(guò)程:
int *pointerDuckWeight; int (*pointerGetAge)(); /// 賦值語(yǔ)法:指針名=&類名:靜態(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指針+指向類靜態(tài)和非靜態(tài)成員的指針的文章就介紹到這了,更多相關(guān)C++指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(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-02C++用指針變量作為函數(shù)的參數(shù)接受數(shù)組的值的問(wèn)題詳細(xì)總結(jié)
以下是對(duì)C++中用指針變量作為函數(shù)的參數(shù)接受數(shù)組的值的問(wèn)題進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(904.水果裝入果籃),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++模板以及實(shí)現(xiàn)vector實(shí)例詳解
模板是為了實(shí)現(xiàn)泛型編程,所謂泛型編程,就是指編寫(xiě)與類型無(wú)關(guān)的代碼,下面這篇文章主要給大家介紹了關(guān)于C++模板以及實(shí)現(xiàn)vector的相關(guān)資料,需要的朋友可以參考下2021-11-11VC++實(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)類型)enum class類型等C++11的新特性來(lái)講解,需要的朋友可以參考下2016-01-01C++ inline內(nèi)聯(lián)函數(shù)詳解
這篇文章主要介紹了C++ inline內(nèi)聯(lián)函數(shù)詳解,有感興趣的同學(xué)可以借鑒參考下2021-02-02