1. 程式人生 > >C++基礎:類與物件(物件呼叫成員函式 this指標)

C++基礎:類與物件(物件呼叫成員函式 this指標)

1.一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加上this的,它作為非靜態成員函式的隱含形參,對各成員的訪問均通過this進行。

this指標的使用:

一種情況就是,在類的非靜態成員函式中返回類物件本身的時候,直接使用 return *this;另外一種情況是當引數與成員變數名相同時使用this指標,如this->n = n (不能寫成n = n)。

為什麼要有this,this起到什麼作用?話還是要從類和物件說起,定義一個物件,系統要給該物件分配儲存空間,如果該類包含了資料成員和成員函式,就要分別給資料和函式的程式碼分配儲存空間。按照正常額思路,如果類定義了2個物件,那麼就應該分別給這2個物件的資料和函式分配空間。但事實並非如此,C++的編譯系統只用了一段空間來存放在各個共同的函式程式碼段,在呼叫各個物件的成員函式時,都與呼叫這個公共的函式程式碼

。因此,每個物件的儲存空間都只是該物件資料成員所佔用的儲存空間,而不包括成員函式程式碼所佔有的空間,函式程式碼是儲存在物件空間之外的。但是問題就出來了,既然所有物件所呼叫的成員函式程式碼只是單獨一封,那麼成員函式是怎麼知道當前呼叫自己的是哪一個物件呢?

  這時就誕生了this這個自引用的指標。每當建立一個物件時,系統就把this指標初始化為指向該物件,即this指標的值為當前呼叫成員函式的物件的起始地址。每當呼叫一個成員函式時,系統就把this指標作為一個隱含的引數傳給該函式。不同的物件呼叫同一個成員函式時,C++編譯器將根據成員函式的this指標所指向的物件來確定應該呼叫哪一個物件的資料成員。通過下面一個簡單例項就可說明。

#include "stdafx.h"
 #include <iostream>
 #include <string>
 
 
 class Num
 {
 private:
 int a;
         std::string objectName;
 public:
         Num(std::string objectName,int a);
 void showNum();
 };
 
 Num::Num(std::string objectName,int a)
 {
 this->objectName=objectName;
 this->a=a;
 }
 
 void Num::showNum()
 {
     std::cout<<this->objectName<<":this="<<this<<" a="<<this->a<<std::endl;
 }
 
 
 int main()
 {
     Num num1("num1",1);
     Num num2("num2",2);
     Num num3("num3",3);
 
     num1.showNum();
     num2.showNum();
     num3.showNum();
 
 return0;
 }

結果:

-------------------------------------------------------------------------------------------------

關於this指標的一個經典回答:   

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

---------------------------------------------------------------------------------------------

關於this的若干回答:

1:this只能在成員函式中使用。全域性函式,靜態函式都不能使用this。
2:由此可見,this在成員函式的開始前構造的,在成員的結束後清除。這個生命週期同任一個函式的引數是一樣的,沒有任何區別。   當呼叫一個類的成員函式時,編譯器將類的指標作為函式的this引數傳遞進去。
3:this指標是什麼時候建立的?   this在成員函式的開始執行前構造的,在成員的執行結束後清除。   
4:this指標存放在何處?堆,棧,全域性變數,還是其他?   this指標會因編譯器不同,而放置的位置不同。可能是棧,也可能是暫存器,甚至全域性變數。   
5:this指標如何傳遞給類中函式的?繫結?還是在函式引數的首引數就是this指標.那麼this指標又是如何找到類例項後函式的?   this是通過函式引數的首引數來傳遞的。this指標是在呼叫之前生成的。類例項後的函式,沒有這個說法。類在例項化時,只分配類中的變數空間,並沒有為函式分配空間。自從類的函式定義完成後,它就在那兒,不會跑的。   
6:this指標如何訪問類中變數的/?   如果不是類,而是結構的話,那麼,如何通過結構指標來訪問結構中的變數呢?如果你明白這一點的話,那就很好理解這個問題了。   在C++中,類和結構是隻有一個區別的:類的成員預設是private,而結構是public。   this是類的指標,如果換成結構,那this就是結構的指標了。   
7:我們只有獲得一個物件後,才能通過物件使用this指標,如果我們知道一個物件this指標的位置可以直接使用嗎?   this指標只有在成員函式中才有定義。因此,你獲得一個物件後,也不能通過物件使用this指標。所以,我們也無法知道一個物件的this指標的位置(只有在成員函式裡才有this指標的位置)。當然,在成員函式裡,你是可以知道this指標的位置的(可以&this獲得),也可以直接使用的。   
8:每個類編譯後,是否建立一個類中函式表儲存函式指標,以便用來呼叫函式?   普通的類函式(不論是成員函式,還是靜態函式),都不會建立一個函式表來儲存函式指標的。只有虛擬函式才會被放到函式表中。   但是,即使是虛擬函式,如果編譯器能明確知道呼叫的是哪個函式,編譯器就不會通過函式表中的指標來間接呼叫,而是會直接呼叫該函式

相關推薦

C++基礎物件(物件呼叫成員函式 this指標)

1.一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果。this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候

c++物件,封裝,訪問限定符,預設成員函式

到底什麼是類?什麼是物件?          類是一個抽象的概念,它不存在於現實中的時間/空間裡,類只是為所有的物件定義了抽象的屬性與行為。          類是一個靜態的概念,類本身不攜帶任何

C++物件(最終)

前兩篇關於類與物件的部落格,都是類與物件中不可或缺的物件,這篇就是在前兩篇的基礎上,再對類與物件進行補充。 一.簡識深淺拷貝 當我們進行拷貝造作函式,或者賦值運算子過載的時候,我們不給出這兩個函式,編譯器就會預設自動生成,預設對類進行位拷貝(按照基本型別進行值的拷貝)。 那麼編譯器給的到

C++物件(上)

1.類與物件的初步認知 ç語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函式呼叫逐步解決問題。 C ++是基於面向物件的,關注的是物件,將一件事情拆分成不同的物件,靠物件之間的互動完成。 2.類的引入 Ç語言中,結構體中只能定義變數,在C +

Objective-C Runtime 執行時之一物件

Objective-C語言是一門動態語言,它將很多靜態語言在編譯和連結時期做的事放到了執行時來處理。這種動態語言的優勢在於:我們寫程式碼時更具靈活性,如我們可以把訊息轉發給我們想要的物件,或者隨意交換一個方法的實現等。 這種特性意味著Objective-C不僅需要一

c++上機實驗二物件

實驗目的和要求 1. 掌握類、類的資料成員、類的成員函式的定義方式。 2. 理解類成員的訪問控制方式。 3. 掌握物件的定義和操作物件的方法。 4. 理解建構函式和解構函式的定義與執行過

C++面向物件實驗二物件

C++實驗二:類與物件 一、實驗目的 類的建立和使用類來建立物件。 類的資料成員的宣告。 成員函式的宣告和定義。 Private,public訪問限定符的使用。 使用提供的公有的成員函式給物件

小朋友學C++(3)物件

(一)類與物件 類是由我們根據客觀事物抽象而成,形成一類事物,然後用類去定義物件,形成這類事物的具體個體。 比如小狗是一個類,你家的“旺財”則是小狗一個具體的物件。 (二)屬性與方法 一般把類的資料成員稱為類的屬性,把類的函式成員稱為方法。 比如小

c++物件之預設成員函式

c++類與物件(二) 1.類的6個預設成員函式 一:建構函式 建構函式是一個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有一個合適的初始值,並且在物件的生命週期內只調用一次。 建構函式是特殊的成員函式,其特徵如下:

c++基礎2——物件

1、class的構成 class 類名{     public://公有成員      函式1;     變數1;      ……   

Java之路物件

一、類 將具有相同屬性及相同行為的一組物件稱為類(class)。廣義地講,具有共同性質的事物的集合就稱為類。 在面向物件程式設計中,類是一個獨立的單位,它有一個類名,其內部包括成員變數,用於描述物件的屬性;還包括類的成員方法,用於描述物件的行為。 在Java程式設計中,類被認為是

Django核心orm物件關係對映

元類 python中所有東西都是物件,包括類也是物件,建立類的類就叫做元類,參考文章深刻理解元類 一個例項 def upper_attr(class_name,class_parents,class_attr): new_attr={} for name,valu

C++中 物件的定義,的作用域,成員this指標

概要 這篇文章主要內容是關於類與物件,類的定義,類的作用域,類中成員,this指標。寫的比較粗,後期有時間再改。 什麼是類? 對於類,我認為最早的發言人還是亞里士多德。他歸納事物的方法就是這是什麼(屬性)、能幹什麼(方式)、 起個名字(物件名) 、歸類(抽象)

C#基礎陣列(物件陣列)

陣列實現位System.Array類的例項,實現了IList,ICollection,IEnumerable介面,陣列一旦建立大小固定,不能新增,刪除元素。  public abstract class Animal//父類,抽象類     {         priv

C++基礎學習筆記動態記憶體分配

實現一個簡單的string類 user.h //!時間:2017年9月11日(週一)上午 //!內容:類與動態記憶體分配 //!備註:Test類實現簡單的string功能 //!最後修改時間:NULL //user.cpp #define _CRTDBG_MAP_ALLOC//記憶體

Java物件

Java:類與物件 隨著時間的發展語言的興起,物件逐漸被人熟知,這裡的物件可不是男女朋友那種,是隨著C++,Java興起的面向物件的物件。(註釋:C語言為面向過程語言,C++是基於面向物件的語言,但又包含了部分的C,所以不算純面嚮物件語言,Java是純面嚮物件語言)下面就以Java為例

C++實驗二 物件 (附答案)

實驗二  類與物件 實驗目的和要求     1.掌握類、類的資料成員、類的成員函式的定義方式。     2.理解類成員的訪問控制方式。     3.掌握物件的定義和操作物件的方法。     4.理解建構函式和解構函式的定義與執行過程。     5.掌握過載建構函式的方

C++初識物件(2)

在之前的文章裡,我們出初步瞭解了,什麼是類,類如何定義,類的大小怎麼計算等 一個空類裡面什麼也沒有,但是它並非是什麼也沒有,只要是類,它就有6個預設的成員函式: 1.建構函式 2.解構函式 3.拷貝建構函式 4.賦值操作符過載 5.取地址操作符過載 6.co

iOS開發之關於Runtime執行時物件

Objective-C語言是一門動態語言,它將很多靜態語言在編譯和連結時期做的事放到了執行時來處理。這種動態語言的優勢在於:我們寫程式碼時更具靈活性,如我們可以把訊息轉發給我們想要的物件,或者隨意交換一個方法的實現等。 這種特性意味著Objective-C不僅需要一個編譯器,還需要一個執行時系統

Powershell基礎物件

物件 Powershell中,我們可以自定義物件。物件的建立和使用方式類似javascript等其他指令碼語言 初始化 $myObj=New-Object PSObject -Property ` @{ apple="