日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数)

發(fā)布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. this 指針

C++ 中,每一個對象都能通過 this 指針來訪問自己的地址。 this 指針是所有成員函數(shù)的隱含參數(shù)。因此,在成員函數(shù)內(nèi)部,它可以用來指向調(diào)用對象。

友元函數(shù)沒有 this 指針,因?yàn)橛言皇穷惖某蓡T。只有成員函數(shù)才有 this 指針。

在類中,關(guān)鍵字 this 包含當(dāng)前對象的地址,換句話說,其值為 &object 。當(dāng)您在類成員方法中調(diào)用其他成員方法時,編譯器將隱式地傳遞 this 指針—函數(shù)調(diào)用中不可見的參數(shù):

class Human
{private:void Talk(string msg){cout << msg << endl;}public:void IntroduceSelf(){Talk("hello world"); // Talk(this, "hello world")}
}

方法 IntroduceSelf() 使用私有成員 Talk() 在屏幕上顯示一句話。實(shí)際上,編譯器將在調(diào)用 Talk 時嵌入 this 指針,即 Talk(this, "hello world") 。

從編程的角度看, this 的用途不多,且大多數(shù)情況下都是可選的。見下:

void SetAge(int humansAge)
{this->age = humansAge; // same as age = humansAge
}

調(diào)用靜態(tài)方法時,不會隱式地傳遞 this 指針,因?yàn)殪o態(tài)函數(shù)不與類實(shí)例相關(guān)聯(lián),而由所有實(shí)例共享。要在靜態(tài)函數(shù)中使用實(shí)例變量,應(yīng)顯式地聲明一個形參,并將實(shí)參設(shè)置為 this 指針。

因?yàn)?this 的目的總是指向“這個”對象,所以 this 是一個常量指針,我們不允許改變 this 中保存的地址。

2. 指向類的指針

一個指向 C++ 類的指針與指向結(jié)構(gòu)的指針類似,訪問指向類的指針的成員,需要使用成員訪問運(yùn)算符 -> ,就像訪問指向結(jié)構(gòu)的指針一樣。與所有的指針一樣,您必須在使用指針之前,對指針進(jìn)行初始化。

#include <iostream>
#include <string>
using namespace std;class Box
{public:// 構(gòu)造函數(shù)聲明Box(double, double, double);double Volume();private:double length;     // Length of a boxdouble breadth;    // Breadth of a boxdouble height;     // Height of a box
};Box::Box(double l=2.0, double b=2.0, double h=2.0)
{ cout <<"Constructor called." << endl;length = l;breadth = b;height = h;
}double Box::Volume()
{return length * breadth * height;
}int main(void)
{Box Box1(3.3, 1.2, 1.5);    // Declare box1Box Box2(8.5, 6.0, 2.0);    // Declare box2Box *ptrBox;                // Declare pointer to a class.// 保存第一個對象的地址ptrBox = &Box1;// 現(xiàn)在嘗試使用成員訪問運(yùn)算符來訪問成員cout << "Volume of Box1: " << ptrBox->Volume() << endl;// 保存第二個對象的地址ptrBox = &Box2;// 現(xiàn)在嘗試使用成員訪問運(yùn)算符來訪問成員cout << "Volume of Box2: " << ptrBox->Volume() << endl;return 0;
}

3. 類靜態(tài)成員

可以使用 static 關(guān)鍵字來把類成員定義為靜態(tài)的。當(dāng)我們聲明類的成員為靜態(tài)時,這意味著無論創(chuàng)建多少個類的對象,靜態(tài)成員都只有一個副本。

靜態(tài)成員在類的所有對象中是共享的。如果不存在其他的初始化語句,在創(chuàng)建第一個對象時,所有的靜態(tài)數(shù)據(jù)都會被初始化為零。

我們不能把靜態(tài)成員的初始化放置在類的定義中,但是可以在類的外部通過使用范圍解析運(yùn)算符 :: 來重新聲明靜態(tài)變量從而對它進(jìn)行初始化,如下面的實(shí)例所示。

3.1 靜態(tài)成員變量

靜態(tài)成員數(shù)據(jù)也可以分為共有的(Public)和私有的(Private),靜態(tài)成員數(shù)據(jù)的聲明方法為:

static data_type data_name;

由于靜態(tài)成員數(shù)據(jù)不是僅僅屬于某一個具體對象的,所以它不能再構(gòu)造函數(shù)中被初始化。否則豈不是每創(chuàng)建一個對象,靜態(tài)成員數(shù)據(jù)都要被初始化一次?

如果類的頭文件會被直接或間接地重復(fù)包含,則靜態(tài)成員數(shù)據(jù)也會被重復(fù)初始化。為了避免這個問題,我們可以將類的聲明和定義分離。

如果類的頭文件絕對不會被重復(fù)包含,那么把靜態(tài)成員數(shù)據(jù)的初始化放在類的頭文件中也是勉強(qiáng)可以接受的。

靜態(tài)成員數(shù)據(jù)的初始化語句為:

數(shù)據(jù)類型 類名::靜態(tài)成員數(shù)據(jù)=初始值;

靜態(tài)成員數(shù)據(jù)是某一個類所具有的屬性,而不是某一個對象的屬性,所以它的存在并不依賴于對象。
示例代碼:

#include <iostream>
#include <string>
using namespace std;class Box
{public:Box(double, double, double);  // 構(gòu)造函數(shù)聲明double Volume();static int objectCount;private:double length;     // Length of a boxdouble breadth;    // Breadth of a boxdouble height;     // Height of a box
};// 初始化類 Box 的靜態(tài)成員
int Box::objectCount = 0;Box::Box(double l=2.0, double b=2.0, double h=2.0)
{ cout <<"Constructor called." << endl;length = l;breadth = b;height = h;objectCount++; // 每次創(chuàng)建對象時增加 1
}double Box::Volume()
{return length * breadth * height;
}int main(void)
{Box Box1(3.3, 1.2, 1.5);    // 聲明 box1Box Box2(8.5, 6.0, 2.0);    // 聲明 box2// 輸出對象的總數(shù)// Total objects: 2cout << "Total objects: " << Box::objectCount << endl;return 0;
}

3.2 靜態(tài)成員函數(shù)

既然成員數(shù)據(jù)可以屬于某一個類而不屬于某一個具體的對象,那么成員函數(shù)也可以這樣。在 C++ 中靜態(tài)成員函數(shù)也是屬于某一個類而不屬于某一個具體的對象的。

靜態(tài)成員函數(shù)的聲明方法為:

static 返回值類型 函數(shù)名(參數(shù)表);

不過在定義靜態(tài)成員函數(shù)時,卻不能出現(xiàn) static 。

如果把函數(shù)成員聲明為靜態(tài)的,就可以把函數(shù)與類的任何特定對象獨(dú)立開來。靜態(tài)成員函數(shù)即使在類對象不存在的情況下也能被調(diào)用,靜態(tài)函數(shù)只要使用類名加范圍解析運(yùn)算符 :: 就可以訪問。

由于靜態(tài)成員函數(shù)是屬于類的,不是屬于某一個具體的對象,所以它分不清楚到底是哪個對象的非靜態(tài)成員數(shù)據(jù),故而不能訪問非靜態(tài)成員數(shù)據(jù)。

所以靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量數(shù)據(jù)、其他靜態(tài)成員函數(shù)和類外部的其他函數(shù)。

靜態(tài)成員函數(shù)有一個類范圍,他們不能訪問類的 this 指針。您可以使用靜態(tài)成員函數(shù)來判斷類的某些對象是否已被創(chuàng)建。

靜態(tài)成員函數(shù)與普通成員函數(shù)的區(qū)別:

  • 靜態(tài)成員函數(shù)沒有 this 指針,只能訪問靜態(tài)成員(包括靜態(tài)成員變量和靜態(tài)成員函數(shù))。
  • 普通成員函數(shù)有 this 指針,可以訪問類中的任意成員;而靜態(tài)成員函數(shù)沒有 this 指針。
#include <iostream>
#include <string>
using namespace std;class Box
{public:Box(double, double, double);  // 構(gòu)造函數(shù)聲明double Volume();static int objectCount;static int getCount();private:double length;     // Length of a boxdouble breadth;    // Breadth of a boxdouble height;     // Height of a box
};// 初始化類 Box 的靜態(tài)成員
int Box::objectCount = 0;// 在定義靜態(tài)成員函數(shù)時,卻不能出現(xiàn) `static`
int Box::getCount()
{return objectCount;
}
Box::Box(double l=2.0, double b=2.0, double h=2.0)
{ cout <<"Constructor called." << endl;length = l;breadth = b;height = h;objectCount++; // 每次創(chuàng)建對象時增加 1
}double Box::Volume()
{return length * breadth * height;
}int main(void)
{// 在創(chuàng)建對象之前輸出對象的總數(shù)cout << "Inital Stage Count: " << Box::getCount() << endl;Box Box1(3.3, 1.2, 1.5);    // 聲明 box1Box Box2(8.5, 6.0, 2.0);    // 聲明 box2// 在創(chuàng)建對象之后輸出對象的總數(shù)cout << "Final Stage Count: " << Box2.getCount() << endl;return 0;
}

其中 Box2.getCount() 等價于 Box::getCount()。即 類型::靜態(tài)成員函數(shù)(參數(shù)列表) 等價于 對象名.靜態(tài)成員函數(shù)(參數(shù)列表),但更推薦前者,比較符合靜態(tài)成員函數(shù)定義。

輸出結(jié)果:

Inital Stage Count: 0
Constructor called.
Constructor called.
Final Stage Count: 2

類中特殊成員變量的初始化問題:

  • 常量變量:必須通過構(gòu)造函數(shù)參數(shù)列表進(jìn)行初始化。
  • 引用變量:必須通過構(gòu)造函數(shù)參數(shù)列表進(jìn)行初始化。
  • 普通靜態(tài)變量:要在類外通過"::"初始化。
  • 靜態(tài)整型常量:可以直接在定義的時候初始化。
  • 靜態(tài)非整型常量:不能直接在定義的時候初始化。要在類外通過"::"初始化。

總結(jié)

以上是生活随笔為你收集整理的C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。