文章目錄:
- 1. const的使用
- 2. this指標
- 2.1 前言(this指標的引出)
- 2.2 什么是this指標
- 2.3 this指標的特性
- 2.4 [面試題1] this指標存在哪?
- 2.5 [面試題2] this指標可以為空嗎?
- 3. 常方法
1. const的使用
const的使用有以下四種情況:
- const int* p
- int const *p
- int* const p
- const int* const p
我們可以通過以下圖解來理解這四種情況const到底修飾的是誰:

- 當const在 “ * ” 的左邊,則指向的值不能被修改
- 當const在 “ * ” 的右邊,則自身不能被修改
2. this指標
2.1 前言(this指標的引出)
觀察如下代碼,我們會發現,Date類中有Display和SetDate兩個成員函式,函式體中沒有關于不同物件的區分,那么當d1呼叫SetDate函式時,該函式是如何知道應該設定d1物件,還是設定d2物件呢?
#include<iostream>
using namespace std;
class Date
{
public:
void DisPlay()
{
cout << _year <<"_"<< _month <<"_"<< _day << endl;
}
void SetDate(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1, d2;
d1.SetDate(2018, 12, 15);
d2.SetDate(2021, 4, 8);
d1.DisPlay();
d2.DisPlay();
return 0;
}
為了解決上述問題,C++中引入了this指標
2.2 什么是this指標
C++編譯器給每個"非靜態的成員函式"增加了一個隱藏的指標引數,讓該指標指向當前物件(誰呼叫此函式,誰就是當前物件),在函式體中所有成員變數的操作,都是通過該指標去訪問,只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編譯器自動完成,
2.3 this指標的特性
- this指標的型別:類的型別* const
- 只能在”成員函式“的內部使用
this指標本質上其實是一個成員函式的形參,是物件呼叫成員函式時,將物件地址作為實參傳遞給this形參,所以物件中不存盤this指標this指標是成員函式第一個隱含的指標形參,一般情況由編譯器通過ecx暫存器自動傳遞,不需要用戶傳遞this指標代表了當前物件的地址,一般情況是隱藏的
驗證一:

此處為什么會報錯呢?因為this指標一般是由編譯器通過ecx暫存器自動傳遞的,不需要用戶傳遞,而用戶寫入this指標相當于完成了編譯器的作業,所以會報錯
驗證二:
哪種情況需要我們寫入this指標呢?

如上圖所示,我們會發現情況一,如果不使用this指標,相當于將自己賦值給自己,和私有屬性中的_year,_month,_day沒有關系,這樣寫沒辦法區分哪個私有屬性中的哪個是引數中的,所以,只需向情況二一樣,在私有成員前加是this指標即可
2.4 [面試題1] this指標存在哪?
編譯器在生成程式時加入了獲取物件首地址的相關代碼,并把獲取的相關首地址存放在暫存器ECX中(VC++編譯器是放在ECX中,其他編譯器有可能不同),也就是成員函式的其他引數正常都是存放在堆疊中,而this指標引數存放在暫存器中
2.5 [面試題2] this指標可以為空嗎?
當我們呼叫函式時,如果函式內部不需要使用到this指標,也就是不需要通過this指標指向當前物件并對其進行操作時,this指標可以為空(eg:在函式中什么都不放,或者隨便列印一個字串);如果呼叫的函式需要this指標指向當前物件,并進行操作時,this指標不能為空,否則就會發生錯誤(空指標參考)
3. 常方法
在一個普通成員函式后面加上const修飾,就是常成員函式

- 常方法可以訪問物件中的常成員,也可以訪問普通成員
- 常方法不允許修改任何資料資料的值
意義:可以防止程式員不下心修改了成員變數的值
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/274387.html
標籤:java
上一篇:RabbitMQ 入門 (Go) - 6. 資料持久化(上)
下一篇:Tomcat安裝及配置


