友元函式沒有this指標,因為友元不是類的成員。只有成員函式才有this指標。
下面給出乙個案例幫助我們更好的理解:
#include #include using namespace std;
//cperson類
class cperson
; //獲取年齡
void getage(void)
//獲取姓名
void getname(void) };
//結構體型別 tagperson
struct tagperson
;//獲取年齡
void getage(tagperson *per)
//獲取姓名
void getname(tagperson *per)
int main()
此段**中宣告了乙個cperson類和乙個tagperson結構體型別。在c語言中用乙個函式來獲取和設定結構體變數, 我們是通過傳遞這個變數的指標來實現的。那麼c++中類成員函式是如何知道哪個物件呼叫了它?並正確顯示呼叫它的物件的資料呢?很多書上也都已經介紹了,當乙個物件呼叫某成員函式時會隱式傳入乙個引數, 這個引數就是this指標。this指標中存放的就是這個物件的首位址。這和c中通過向函式傳遞結構體變數的位址是不是很像?!只是傳參形式不一樣罷了!在c中我們是手工把結構體變數和函式關聯起來的,而c++則是編譯器幫我們把類資料和成員函式關聯起來的並通過名稱粉碎和編譯時檢查等形式防止外部的任意訪問。
那麼這個this指標存放在**呢?其實編譯器在生成程式時加入了獲取物件首位址的相關**。並把獲取的首位址存放在了暫存器ecx中(vc++編譯器是放在ecx中,其它編譯器有可能不同)。也就是成員函式的其它引數正常都是存放在棧中。而this指標引數則是存放在暫存器中。類的靜態成員函式因為沒有this指標這個引數,所以類的靜態成員函式也就無法呼叫類的非靜態成員變數。
當上面的**被編譯和執行時,它會產生下列結果:
// 編譯執行結果:
年齡:55
姓名:劉德華
年齡:56
姓名:周潤發
在c++primer(第5版)一書中給出了this指標的定義(p231):
當我們呼叫成員函式時,實際上是替某個物件呼叫它。
成員函式通過乙個名為this的額外隱式引數來訪問呼叫它的那個物件,當我們呼叫乙個成員函式時,用請求該函式的物件位址初始化this。例如,如果呼叫 total.isbn()則編譯器負責把 total 的位址傳遞給 isbn 的隱式形參this,可以等價地認為編譯器將該呼叫重寫成了以下形式:
//偽**,用於說明呼叫成員函式的實際執行過程
class sales_data;
sales_data::isbn(&total)
其中,呼叫 sales_data 的 isbn 成員時傳入了 total 的位址。
在成員函式內部,我們可以直接使用呼叫該函式的物件的成員,而無須通過成員訪問運算子來做到這一點,因為 this 所指的正是這個物件。任何對類成員的直接訪問都被看作是對 this 的隱式引用,也就是說,當 isbn 使用 bookno 時,它隱式地使用 this 指向的成員,就像我們書寫了 this->bookno 一樣。
對於我們來說,this 形參是隱式定義的。實際上,任何自定義名為 this 的引數或變數的行為都是非法的。我們可以在成員函式體內部使用 this,因此儘管沒有必要,我們還是能把 isbn 定義成如下形式:
std::string isbn() const
因為this的目的總是指向"這個"物件,所以this是乙個常量指標,我們不允許改變this中儲存的位址。
由於物件內可能包含指標,32位系統分配給指標的大小為4個位元組,64位系統分配給指標的大小為8個位元組
// 以下若無特殊說明均預設為32位系統下的測試結果分析 //
下面先給出一段測試程式:
#include "pch.h"
#include using namespace std;
class a {};
class b {};
class c :public a ;
class d :public b, public c {};
int main()
接下來我們分析這段**:
這裡給出總結:
面試覆盤 2020 05 25
華東地區企事單位專場 製造業高質量發展 專區 企業 中國電子科技南湖研究院 崗位 新一代人工智慧方向科研人員 企業 中國兵器裝備集團上海電控研究所 崗位 計算機視覺演算法工程師 企業 浙江清華長三角研究院 崗位 智慧型裝備中心 演算法工程師 企業 中國電子科技集團公司第三十六研究所 崗位 研發類 硬...
面試覆盤 2020 05 30
1 專案開發過程中,遇到過什麼問題讓你感覺很沮喪 失敗的經歷,遇到的困難 細節和技巧 tip 一定要有,面試官在考驗能不能發現自身的問題,並從解決過程中了解你的能力,以及如何改進的 2 你的行業規劃是什麼?對於崗位的了解有多少?為什麼會對這個崗位感興趣?3 你對於這個崗位,有沒有一些能力提公升的計畫...
面試覆盤 2020 06 13
參考 1 仔細講一下你專案的意義,應用場景,具體過程?2 第乙個專案資料同步是怎麼實現?3 具體解釋一下第二個專案中元學習的概念和實現過程?1 gan的思想?損失函式?對抗px logd x pg log 1 d x 2 lstm三個門?對應的作用?公式?啟用函式?為什麼存在兩類啟用函式 tanh和...