1. 程式人生 > >this指標你“造(知道)”嗎?

this指標你“造(知道)”嗎?

1,在類中資料是怎麼儲存的?
用類去定義物件時,系統會為每一個物件分配儲存空間。如果一個類包括了資料和函式,要分別為資料和函式的程式碼分配儲存空間。
如圖:模型一
這裡寫圖片描述
模型二:
這裡寫圖片描述

可以通過求類的大小來測試編譯器採用的哪種模式。如果大於double型別的位元組數,則採用的第一種模式,等於double位元組則採用的第二個模式。

#include<iostream>
using namespace std;
const double PI = 3.1415926;
class circle
{
private:
    double radius;
public:
    void
Init(double _radius) { radius = _radius; } void Print() { cout << "area=" << PI*radius*radius << endl; } }; int main() { cout << sizeof(circle) << endl; system("pause"); return 0; } //輸出為8位元組,剛好是資料部分的double型別的大小

結論:C++編譯系統正採用模式二的,每個物件所佔用的儲存空間只是該物件的資料部分所佔用的儲存空間,而不包括函式程式碼所佔用的儲存空間。


那麼問題來了。。所的有物件都呼叫共用的函式程式碼段,如何區分的呢。這個功勞就是c++中this指標的了!
c++設定了 this 指標,this 指標指向呼叫該函式的不同物件。。
2,this指標作用

#include<iostream>
using namespace std;
const double PI = 3.1415926;
class circle
{
private:
    double radius;
public:
    void Init(double _radius)
    {
        radius = _radius;
    }
    void
Print() { cout << "area=" << PI*radius*radius << endl; } }; int main() { circle cir1, cir2; cir1.Init(23.2); cir2.Init(13.6); cout << sizeof(circle) << endl; cir1.Print(); cir2.Print(); system("pause"); return 0; }

如上程式碼,建立兩個物件cir1,cir2。通過上述介紹,我們直到c++編譯器,將函式部分作為公共程式碼區域。通過cir1.Init()使得函式init與物件cir1繫結。通過cir2.Init()使得函式init與物件cir2繫結。類成員函式的形參和類的屬性,名字相同,而不同物件可以實現不同資料的操作這是怎麼實現的呢?
其實,每個成員函式都有一個this指標,this指標指向呼叫物件。即,某個物件正在呼叫成員函式那麼this指標就指向哪個物件。this指標並不是物件本身的一部分,不影響sizeof的結果(已證明)。
這裡寫圖片描述
3,this指標如何產生?
然而我們在程式設計時,並沒有寫入有關this指標的任何宣告和定義,那麼this指標又是如何產生的呢?
this指標是類成員函式的第一個預設隱含引數,編譯器自動維護傳遞。
這裡寫圖片描述
將上面程式碼修改為上示程式碼。執行後,結果是一致的。
所以函式引數本質應該是

void Init(circle* this ,double _radius)//
    { 
        this->radius = _radius;     
    }
    void Print(circle* this )//
    {
        cout << "area=" << PI*this->radius*this->radius << endl;
    }

猜想:“因為this指標在指向一個物件的時候,指標所存放的是呼叫物件的地址,所以應該是常屬性的的指標。”
驗證:如果this指標是非const指標,那麼意味著在它被賦值為物件地址後可以被賦值為空。否則,是const指標。
這裡寫圖片描述
結果這種賦值語法錯誤。所以this指標的型別應該為:類名*const this

void Init(circle* const this ,double _radius);
void Print(circle* const this )

4,關於this指標一個經典回答。
當你進入一個房子後,你可以看見桌子、椅子、地板等, 但是房子你是看不到全貌了。對於一個類的例項來說, 你可以看到它的成員函式、成員變數,但是例項本身呢?   
this是一個指標,它時時刻刻指向你這個例項本身

this指標總結:
作用:編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加上this的,對各成員的訪問均通過this進行。  
注意事項:
(1)我們只有獲得一個物件後,才能通過物件使用this指標。
(2)this只能在成員函式中使用。
(3)this指標並不是物件本身的一部分,不影響sizeof的結果
(4)this指標是類成員函式的第一個預設隱含引數,編譯器自動維護傳遞,類編寫者不能顯式傳遞(可用C語言模擬實現)
(5)this的作用域在類成員函式的內部

相關推薦

this指標知道

1,在類中資料是怎麼儲存的? 用類去定義物件時,系統會為每一個物件分配儲存空間。如果一個類包括了資料和函式,要分別為資料和函式的程式碼分配儲存空間。 如圖:模型一 模型二: 可以通過求類的大小來測試編譯器採用的哪種模式。如果大於double型別的

知道的JavaScriptthis和物件原型原型

  五章 原型 1、[[ Prototype ]] JavaScript 中的物件有一個特殊的 [[Prototype]] 內建屬性,其實就是對於其他物件的引用。幾乎所有的物件在建立時 [[Prototype]] 屬性都會被賦予一個非空的值。 對於預設的 [[Get]] 操作來說,如果無法在

mybatis 代碼生成器IDEA, Maven)及配置詳解部分配置應該不知道

win 項目 找到 mini 屬性 新建 ini 默認 sub 在使用 mybatis 過程中, 當手寫 JavaBean和XML 寫的越來越多的時候, 就越來越同意出錯。這種重復性的工作, 我們當然不希望做那麽多。 還好, mybatis 為我們提供了強大的代碼生成--M

【c語言】帶真正走進指標的世界——陣列與指標的關係

       每天下課之後,都感覺老師上課在神仙程式設計,我們一群凡人在底下面無表情地走神,前一秒還是在講加減乘除的基本用法,後一秒就變成了指標陣列、陣列指標、結構體指標和N級指標的性質以及運用............(真是令人頭禿 —^—) ——————

mybatis 程式碼生成器IDEA, Maven)及配置詳解部分配置應該不知道

在使用 mybatis 過程中, 當手寫 JavaBean和XML 寫的越來越多的時候, 就越來越同意出錯。這種重複性的工作, 我們當然不希望做那麼多。 還好, mybatis 為我們提供了強大的程式碼生成–MybatisGenerator。 通過簡單的配置,

c++中this指標的理解轉載:苦澀的茶 ——產品開發 C++類中this指標的理解

先要理解class的意思。class應該理解為一種型別,象int,char一樣,是使用者自定義的型別。用這個型別可以來宣告一個變數,比如int x, myclass my等等。這樣就像變數x具有int型別一樣,變數my具有myclass型別。理解了這個,就好解釋this了,m

指標詳解1-- 軌道線指標ENE詳解

本質 平均值 width 簡單 公式 方向 重新 alt 改變 軌道線指標(ENE): 1、定義:軌道線(ENE)由上軌線(UPPER)和下軌線(LOWER)及中軌線(ENE)組成,軌道線的優勢在於其不僅具有趨勢軌道的研判分析作用,也可以敏銳的覺察股價運行過程中方向的改

指標詳解5-- 布林線指標BOLL詳解

tar 線下 pan evel 隨著 向上 log link bsp 一、定義:布林線指標,即BOLL指標,其英文全稱是“Bollinger Bands”,布林線(BOLL)由約翰·布林先生創造,其利用統計原理,求出股價的標準差及其信賴區間,從而確定股價的波動範圍及未來走勢

this怎麽用基礎

其他 如果 animal this 問題 公司 方法 back eat this關鍵字的概述 this關鍵字代表是對象的引用。也就是this在指向一個對象,所指向的對象就是調用該函數的對象引用。this關鍵字作用 1. 如果存在同名成員變量與局部變量時,在方法內部默認

javascript中this指向的理解轉載

       JS中的this指向一直是個讓人頭疼的問題,想當初我學的是天昏地暗,查了好多資料,看的頭都大了,跟他大戰了那麼多回合,終於把它搞定個七八分,其實往往都是我們複雜化了,現在就讓大家輕鬆看懂this的指向,我會分以下幾種情況來說。 this的指向: &nb

初學者對指標的理解1

[email protected][TOC](如何理解c語言中的指標 標題 初學者對指標的理解(1) 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。很多功能還不太熟練 什麼是指標 明白資料在記憶體中的儲存 當你在程式中定義一個變

有些話,只想要對01

                                          &nb

c語言指標進階

指標也是一種資料型別 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。 1)指標是一種變數,佔有記憶體空間,用來儲存記憶體地址

指標加減指標與數字 + and -

今天要記錄一個很重要的知識點那就是指標加減一個數和指標加減指標。 1、指標 + 一個數     √ 2、指標 - 一個數     √ 3、指標 + 指標      

c語言指標進階

指標與記憶體四區理解的強化 1)主調函式 被調函式 主調函式可把堆區棧區全域性區的資料記憶體地址傳給被調函式 被調函式只能返回堆區 全域性資料 2)記憶體分配方式 指標做函式引數 是有輸入輸出特性的 輸入指的是 在主函式分配記憶體 在子函式修改 輸出指的是 在子函式分

this與super關鍵字

一、this關鍵字: 1、this在類中的普通作用: 1)this在java中就是指當前物件,在靜態方法中不能出現,可以通過(this.)的方法來呼叫當前物件的屬性和方法 2、this在構造器中的中的作用: 1)java類中的構造器之間是可以通過this(arg1,arg2)的形式相互呼叫的,但是th

Can you solve this equation? HDU - 2199 二分

Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 26314 Accep

C和指標讀書筆記1

第一章程式碼 程式碼 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_COLS 20 /*所能處理的最大列號*/ #define MAX_INPUT 1000

springcloud dashboard控制面板上的各項指標詳解圖文並茂

回顧 上一篇文章就詳細說了Feign結合Hystrix的詳細使用,以及如何結合原始碼去配置HystrixCommand註解,這裡就開始從dashboard的詳細的功能來說說如何看。 所有的開始-pom.xml 引入依賴,所有的程式碼的第一步就是引入依賴,這裡因為之前的專案針對MQ

數學,我拿怎麼辦2

極大似然函式 「極大似然」是統計學中的概念,容易懂的描述是,假設觀測到一個現象的發生,就有理由認為這個現象(與其他現象相比)發生的「可能性」大。「可能性」是由似然函式刻畫的(不是概率),既可認為造成「可能性」最大的就是真實的引數。 比如,今天是個晴天,可以認為是晴天發生的