C++對This指針的理解

This指針是編譯系統爲類的每個非靜態成員函數添加的隱含形參,一個類可以定義多個對象,但成員函數只有一個,當多個對象調用非靜態成員函數時,編譯系統會將該對象的首地址作爲隱含參數傳給非靜態成員函數的This指針,這樣非靜態成員函數在運行時可以通過This指針找到對象,調用對象的成員數據,實現對對象數據成員的操作。

以下爲參考原文,借鑑他人:

this指針
在建立對象時,系統會爲每一個對象分配獨立的存儲空間,也就是給每個對象中的數據成員都分配有自己獨立的存儲空間。如果對同一個定義n個對象,則有n組同樣大小的空間以存放對象中的數據成員。但對於成員函數來說,對象中的數據成員。一個函數的代碼段在內存中只有一份。也就是說,函數的代碼段在內存中只有一份。也就是說,同一個類中的不同對象在調用自己的成員函數時,一個類中的不同對象在調用自己的成員函數時,其實它們調用的是同一段函數代碼。那麼,其實它們調用的是同一段函數代碼。
那麼,當一個對象調用自己的成員函數時,如何保證成員函數中對數據成員的處理是針對自己的數據成員而不是其他對象的數據成員呢? this指針
假設用一個定義10個對象:編譯系統並不是分別爲10個對象的數據成員成員函數分配存儲單元。而是僅爲每個對象的數據成員分配存儲單元,10個對象的成員函數對應的是同一個函數代碼段。不論成員函數在內定義還是在外定義,成員函數都用以上方式存儲。
其實,在每一個成員函數中都包含一個特殊的指針,這個指針的名字是固定的,稱爲this, 
它的值是當前被調用的成員函數所在的對象的起始地址。在調用成員函數時,系統隱式地將對象的起始地址傳遞給成員函數,使this指針得到當前對象的地址。於是在成員函數中對數據成員的引用,就按照this的指向找到對象的數據成員,實現對數據成員的操作。也就是說, 成員函數中數據成員名的前面隱含有“this->” 的指向。 
this指針 
int Box∷tiji( )  {return (h*w*l); }
int Box∷tiji( )  {return (this->h*this->w*this->l); }
假設a是box對象,當執行a.tiji()時,this=&a 當執行時 int Box∷tiji( ) {return (a.h*a.w*a.l); }
靜態成員 用於的某成員
c++中,可以將關鍵字中可以將關鍵字static用於的某成員,這樣該成員就成爲靜態成員了。 
靜態成員包括:靜態數據成員、靜態成員函數。
靜態數據成員的所有對象共享。
class Box
{
   public:
      int tiji( );
   private:
      static int h;
      int w;
      int l;
};
h爲靜態數據成員,它爲各對象所共有。即使有多個box 對象,h在內存中只佔一份空間(而不是每個對象都分配 h空間)。h的值對所有對象都是一樣的,若改變h的值,則各對象h的值都同時改變了。
#include <iostream>
using namespace std;
class Box
{
   public:
      Box(int,int);
      int tiji( );
      static int h;
      int w;
      int l;
};
Box∷Box(int b,int c) 
{
   w=b;
   l=c;
}
int Box∷tiji( )
{
   return(h*w*l);
}
int Box∷h=10;
int main( )
{
   Box a(15,20),b(20,30);
   cout<<a.h<<endl;
   cout<<b.h<<endl;
   cout<<Box∷h<<endl;
   cout<<a.tiji( )<<endl;
   return 0;
}
(1)在一個類中可以有一個或多個靜態數據成員。靜態數據成員不屬於某一個對象,在爲對象所分配的空間中不包括靜態數據成員所佔的空間。靜態數據成員是在所有對象之外單獨開闢空間。只要在類中定義了靜態數據成員,即使不定義對象,也爲靜態數據成員分配空間。 
(2)靜態數據成員可以初始化,但只能在體外進行初始化。
形式爲:數據名∷靜態數據成員名=初值; 
(3)靜態數據成員既可以通過對象名引用,也可以通過名來引用。 (4)靜態數據成員是在程序編譯時被分配空間的,到程序結束時才釋放空間。 
#include <iostream>
using namespace std;
class Objcount
{
   private: 
     static int count; 該程序可用來統計Objcount對象的個數。
   public:
     Objcount() 若將static去掉,就不能完成該功能。 
    {
      count++;
    }
    int get()
    {
       return count;
    }
};
int Objcount::count=0;
int main()
{
     Objcount a1,a2,a3;
     cout<<”對象的數量是:”<<a1.get();
     cout<<”對象的數量是:”<<a2.get();
     cout<<”對象的數量是:”<<Objcount.get(); 
}
靜態成員
    靜態數據成員爲在一個範圍的數據共享提供了技術支持,而不必使用全局變量。靜態數據成員的主要用途是定義的各個對象所公用的數據
靜態成員
成員函數也可以定義爲靜態的。與靜態數據成員不同,靜態成員函數的作用不是爲了對象之間的溝通,而是爲了能處理靜態數據成員。 
靜態成員函數可以訪問靜態數據成員, 而不能訪問非靜態成員。 
 
 友元通俗地說,就是一個主動聲明本以外的某個函數是它的朋友,進而給它們提供訪問本類成員的特許。
友元包括友元函數和友元類兩種:
(1) 如果在本類中用friend對本以外的某個函數進行了聲明,則該函數就成爲本友元函數。這樣,它雖然不是本成員函數,但它可以訪問本的所有成員,無論是公有成員還是私有成員
聲明爲友元的函數可以是不屬於任何的普通函數,也可以是其它成員函數。 
(2) 如果在本類中(例如A 對另一個例如B )進行了聲明,則B就是 友元類。這時,就是A友元類B中的所有函數就都自動成爲類A友元函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章