網站首頁 編程語言 正文
c++的類中,非靜態的成員函數都有一個隱藏的this指針
,在函數體中所以的成員變量都是通過this指針
來訪問的。但是this指針是對用戶是透明的,用戶不需要顯示的給this指針傳參,編譯時會自動接收參數。
一,this指針的注意點
- 調用成員函數時,不可以顯示給this指針傳參
- 定義成員函數時,不能顯示的聲明this指針
- 在成員函數內部,可以顯示的使用this指針
用一個日期類,來講述this指針的注意點:
class Date { public: void Print() { cout<<_year<<"/"<<_month<<"/"<<_day<
以上就是一個日期類了,在類里面我定義了一個成員函數Print
,這里要講一下,在類中定義一個成員函數可能會被看成內聯函數
,想這么簡單一個Print
?函數一般是會別看成內聯函數的。
其實這個成員函數還可以寫成這樣:
void Print() { cout<_year<<"/"< _month<<"/"< day<
這樣寫有點畫蛇添足的感覺,但是方便大家看,在成員函數中每個成員變量的訪問都里離不開this指針
。這個this指針隱藏在函數形參的頭一位,也就是Print(Date * this)。
比如我要調用這個成員函數:
int main() { Date s1(2022,2,28); Date s2(2022,3,1); s1.Print(); s2.Print(); }
運行結果如下:
可以看到,調用結果是符合預期的,Print函數中是利用this指針
來區分對象的。
錯誤用例:
(1)
int main() { Date s1(2022,2,28); s1.Print(&s1); }
不可以顯示的給this指針傳參,雖然我們知道this指針存在,但是我們不可以給this指針傳參,就當潛規則吧。
(2)
void Date::Print(Date* this);
成員函數的聲明以及定義都不能有this指針,這樣做不行的,可以想想設計者的初心,他是嫌棄老是傳地址麻煩,所以搞了一個隱藏的this指針,你再給函數傳參或者定義函數時給this指針,不是多此一舉嘛。
二,this指針存在哪里
this指針是成員函數第一個隱藏的指針形參
,一般存在棧中。但是也是由編譯器決定的
,有的就存在寄存器中。
三,this指針的面試坑題
class A { public: void PrintA() { cout<<_a<PrintA(); p->Show(); }
問:以上程序可以運行嘛?會崩潰嘛?崩潰在哪里?
這是對空指針解引用導致的內存問題,所以程序崩潰了,this指針可以為空,但是不能對空指針解引用,函數PrintA中,cout<<_a<
;可以寫成cout<< this -> _a<
; 講到這大家應該懂了。
還有一點那么Show函數有問題嘛?沒問題,因為不存在對this的解引用。
我們將PrintA函數屏蔽掉,看運行結果:
總結
原文鏈接:https://blog.csdn.net/lyzzs222/article/details/123189470
相關推薦
- 2022-04-11 解決辦法:error: failed to push some refs to 'https://g
- 2023-01-13 Matlab常用的輸出命令disp與fprintf解讀_python
- 2022-04-05 availableProcessors is already set to [8], rejecti
- 2022-09-25 ubuntu 20.04 開機黑屏小橫杠和循環登錄
- 2023-10-24 Spring中的@Autowired和@Resource區別
- 2022-10-17 Python?Django源碼運行過程解析_python
- 2022-12-09 C++哈希表之閉散列方法的模擬實現詳解_C 語言
- 2022-09-03 C#設計模式之建造者模式_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支