欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年03月10日 11:50:49   作者:機(jī)器學(xué)習(xí)入坑者  
這篇文章主要介紹了C++函數(shù)指針+對(duì)象指針+this指針+指向類靜態(tài)和非靜態(tài)成員的指針,函數(shù)指針定義和賦值的語(yǔ)法指其中數(shù)據(jù)類型代表指向函數(shù)的返回類型,形參表為指向函數(shù)的形參表,更多相關(guān)資料需要的朋友可以參考一下下面文章內(nè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)文章

最新評(píng)論