C++ const的使用及this指針常方法(面試最愛問的this指針)
1. const的使用
const的使用有以下四種情況:
- const int* p
- int const *p
- int* const p
- const int* const p
我們可以通過以下圖解來理解這四種情況const到底修飾的是誰:
當(dāng)const在 “ * ” 的左邊,則指向的值不能被修改
當(dāng)const在 “ * ” 的右邊,則自身不能被修改
2. this指針
2.1 前言(this指針的引出)
觀察如下代碼,我們會發(fā)現(xiàn),Date類中有Display和SetDate兩個成員函數(shù),函數(shù)體中沒有關(guān)于不同對象的區(qū)分,那么當(dāng)d1調(diào)用SetDate函數(shù)時,該函數(shù)是如何知道應(yīng)該設(shè)置d1對象,還是設(shè)置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++編譯器給每個"非靜態(tài)的成員函數(shù)"增加了一個隱藏的指針參數(shù),讓該指針指向當(dāng)前對象(誰調(diào)用此函數(shù),誰就是當(dāng)前對象),在函數(shù)體中所有成員變量的操作,都是通過該指針去訪問。只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編譯器自動完成。
2.3 this指針的特性
this指針的類型:類的類型* const只能在”成員函數(shù)“的內(nèi)部使用this指針本質(zhì)上其實(shí)是一個成員函數(shù)的形參
,是對象調(diào)用成員函數(shù)時,將對象地址作為實(shí)參傳遞給this形參。所以對象中不存儲this指針
this指針是成員函數(shù)第一個隱含的指針形參,一般情況由編譯器通過ecx寄存器自動傳遞,不需要用戶傳遞
this指針代表了當(dāng)前對象的地址
,一般情況是隱藏的
驗(yàn)證一:
此處為什么會報錯呢?因?yàn)閠his指針一般是由編譯器通過ecx寄存器自動傳遞的,不需要用戶傳遞,而用戶寫入this指針相當(dāng)于完成了編譯器的工作,所以會報錯
驗(yàn)證二:
哪種情況需要我們寫入this指針呢?
如上圖所示,我們會發(fā)現(xiàn)情況一,如果不使用this指針,相當(dāng)于將自己賦值給自己,和私有屬性中的_year,_month,_day沒有關(guān)系,這樣寫沒辦法區(qū)分哪個私有屬性中的哪個是參數(shù)中的,所以,只需向情況二一樣,在私有成員前加是this指針即可
2.4 [面試題1] this指針存在哪?
編譯器在生成程序時加入了獲取對象首地址的相關(guān)代碼,并把獲取的相關(guān)首地址存放在寄存器ECX中(VC++編譯器是放在ECX中,其他編譯器有可能不同)。也就是成員函數(shù)的其他參數(shù)正常都是存放在棧中,而this指針參數(shù)存放在寄存器中
2.5 [面試題2] this指針可以為空嗎?
當(dāng)我們調(diào)用函數(shù)時,如果函數(shù)內(nèi)部不需要使用到this指針,也就是不需要通過this指針指向當(dāng)前對象并對其進(jìn)行操作時,this指針可以為空(eg:在函數(shù)中什么都不放,或者隨便打印一個字符串);如果調(diào)用的函數(shù)需要this指針指向當(dāng)前對象,并進(jìn)行操作時,this指針不能為空,否則就會發(fā)生錯誤(空指針引用)
3. 常方法
在一個普通成員函數(shù)后面加上const修飾,就是常成員函數(shù)
常方法可以訪問對象中的常成員,也可以訪問普通成員常方法不允許修改任何數(shù)據(jù)數(shù)據(jù)的值
意義:可以防止程序員不下心修改了成員變量的值
到此這篇關(guān)于C++ const的使用,this指針,常方法(面試最愛問的this指針)的文章就介紹到這了,更多相關(guān)C++ const的使用,this指針,常方法(面試最愛問的this指針)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
帶你用C語言實(shí)現(xiàn)strtok和字符串分割函數(shù)
下面小編就為大家?guī)硪黄猚語言中字符串分割函數(shù)及實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-09-09C++實(shí)現(xiàn)LeetCode(136.單獨(dú)的數(shù)字)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(136.單獨(dú)的數(shù)字),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實(shí)現(xiàn)方法
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實(shí)現(xiàn)方法,簡單說明了哈夫曼樹的原理,并結(jié)合具體實(shí)例形式分析了C++實(shí)現(xiàn)哈夫曼樹的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11C++實(shí)現(xiàn)快捷店會員管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)快捷店會員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03C++開發(fā)在IOS環(huán)境下運(yùn)行的LRUCache緩存功能
本文著重介紹如何在XCODE中,通過C++開發(fā)在IOS環(huán)境下運(yùn)行的緩存功能。算法基于LRU,最近最少使用,需要的朋友可以參考下2012-11-11C++中重載、重寫(覆蓋)和隱藏的區(qū)別實(shí)例分析
這篇文章主要介紹了C++中重載、重寫(覆蓋)和隱藏的區(qū)別,是C++面向?qū)ο蟪绦蛟O(shè)計非常重要的概念,需要的朋友可以參考下2014-08-08