1. 程式人生 > >C++類中this指標的含義

C++類中this指標的含義

有下面的一個簡單的類:

class CNullPointCall
{
public:
    
staticvoid Test1();
    
void Test2();
    
void Test3(int iTest);
    
void Test4();

private:
    
staticint m_iStatic;
    
int m_iTest;
};

int CNullPointCall::m_iStatic =0;

void CNullPointCall::Test1()
{
    cout 
<< m_iStatic << endl;
}

void CNullPointCall::Test2()
{
    cout 
<<"Very Cool!"<< endl; 
}

void CNullPointCall::Test3(int iTest)
{
    cout 
<< iTest << endl; 
}

void CNullPointCall::Test4()
{
    cout 
<< m_iTest << endl; 
}

    那麼下面的程式碼都正確嗎?都會輸出什麼?

CNullPointCall *pNull = nullptr; // 沒錯,就是給指標賦值為空,this為空指標
pNull->Test1();     // 靜態函式,不會傳遞this
pNull->Test2();     // 沒有呼叫this
pNull->Test3(13);   // 沒有呼叫this
pNull->Test4();     // 執行時崩潰,“this是nullptr”

    你肯定會很奇怪我為什麼這麼問。一個值為NULL的指標怎麼可以用來呼叫類的成員函式呢?!可是實事卻很讓人吃驚:除了call 4那行程式碼以外,其餘3個類成員函式的呼叫都是成功的,都能正確的輸出結果,而且包含這3行程式碼的程式能非常好的執行。
    經過細心的比較就可以發現,call 4那行程式碼跟其他3行程式碼的本質區別:類CNullPointCall的成員函式中用到了this指標。

    對於類成員函式而言,並不是一個物件對應一個單獨的成員函式體,而是此類的所有物件共用這個成員函式體當程式被編譯之後,此成員函式地址即已確定

    而一個物件的this指標並不是物件本身的一部分,它只是指向例項化物件本身

的起始地址的一個指標,不會影響sizeof(“物件”)的結果

    this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將this作為一個隱含形參傳遞給函式而成員函式之所以能把屬於此類的各個物件的資料區別開, 就是靠這個this指標。函式體內所有對類資料成員的訪問, 都會被轉化為this->資料成員的方式

    

    對於上面的例子來說,this的值也就是pNull的值。也就是說this的值為NULL。而Test1()是靜態函式,編譯器不會給它傳遞this指標(這裡相當於CNullPointCall::Test1());

    對於Test2()和Test3()兩個成員函式,雖然編譯器會給這兩個函式傳遞this指標,但是它們並沒有通過this指標來訪問類的成員變數,因此call 2和call 3兩行程式碼可以正確呼叫;

    而對於成員函式Test4()要訪問類的成員變數,因此要使用this指標,這個時候發現this指標的值為NULL,就會造成程式的崩潰。    

   this是指向例項化物件本身時候的一個指標,裡面儲存的是物件本身的地址,通過該地址可以訪問內部的成員函式和成員變數。

為什麼需要this?因為this作用域是在類的內部,自己宣告一個類的時候,還不知道例項化物件的名字,所以用this來使用物件變數的自身。在非靜態成員函式中,編譯器在編譯的時候加上this作為隱含形參,通過this來訪問各個成員(即使你沒有寫上this指標)。例如a.fun(1)<==等價於==>fun(&a,1)  

    this的使用:1)在類的非靜態成員函式中返回物件的本身時候,直接用return *this(常用於操作符過載和賦值、拷貝等函式)。

    2)傳入函式的形參與成員變數名相同時,例如:this->n = n (不能寫成n=n)

相關推薦

C++this指標含義

有下面的一個簡單的類:class CNullPointCall{public:    staticvoid Test1();    void Test2();    void Test3(int iTest);    void Test4();private:    stat

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

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

this含義

父類中this指代的是那個物件? 最近打算把《第一行程式碼》這本書再看看,之前都是隨用隨學,有些東西並沒有理解的很好。再看到第二章的時候,看到了如下程式碼: public class BaseActivity extends AppCompatActivit

C++指標成員和拷貝建構函式

對C++程式設計師來說,編寫C++程式有一條必須注意的規則,就是類中包含了一個指標成員的話,那麼 就要小心拷貝建構函式的編寫, 因為一不小心,就會出現記憶體洩漏。 看下面的例子: #include <iostream> class HasPtrMem { pu

C++this指標詳解

這篇文章主要講解隱式this指標的概念,以及如何使用,包含const 先直接給出一個C++Primer裡的類,你可能還不能完全看懂,但是不著急,我們一點點解釋 class Sales_data { std::string isbn() const { return bookNo; } Sale

c++this指標

         當我們進入一個房子之後可以看見房子裡的桌子、椅子、地板等,但是看不到房子的全貌。          對於一個類的例項來說,你可以看到看到他的成員函式,成員變數,但是例項本身呢,就像你想要看到房子裡的東西,要先找到房子一樣,想要訪問例項裡的成員,就先要找到此

C++快速入門---this指標的繼承(10)

C++快速入門---this指標和類的繼承(10)   this是一個特殊的指標 class Human {    char fishc;    Human(char fishc); } Human::Human(char

C++ this指標的詳解 C++this指標的用法詳解

C++中this指標的用法詳解   轉自:http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指標的用處:   一個物件的this指標並不是物件本身的一部分,不會影響sizeof(物件)的結果

c++this指標的用法詳解

為什麼引入this指標?     最簡單的應用場景就是:當我們在類中定義了一個變數,同時在類成員函式中定義了同一變數時,也就是說變數名重複時,但是我們想使用類中定義的變數,這個時候我們該怎麼辦呢?這個時候就是this指標大顯身手的時候了。為此我們引入this指標

詳解:C語言指標和p, p+1, *(p+1), *P+1, p[0], &p[0] 的含義

解析:C語言中的指標和p, p+1, *(p+1), *P+1, p[0], &p[0] 每一種表示式的含義  一、先解決一個問題:什麼是指標 指標就是存放地址的變數。很好,百度上就是這個答案(哈哈,感覺這句話很廢話)。 指標是一個大小固定為4個byte的變數,不管

C++this指標的作用以及用法詳解

為什麼引用this指標? 當我們在類中定義了一個變數,同時又在類成員函式中定義了同一個變數時,也就是變數名重複時,但是我們要想使用類中的定義的變數,此時就需要this指標了。 1.this指標的作用 指標存在於類的成員函式中,指向被呼叫函式類例項的地址。  一個物件的thi

C++this指標的本質

一直以來對C++中的this不理解,只知道在建構函式中,如果建構函式的引數和類成員的名字一樣的話,就可以用this指標來區分,如: this->a = a; 一直以來都有這個疑問:this究竟是什麼?我們明明沒有定義這個this,但是我們可以直接用

C++this指標的理解和用法

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

談談基與子this指標C++)

引入   定義一個類的物件,首先系統已經給這個物件分配了空間,然後會呼叫建構函式(說明:假設存在建構函式)。一個類有多個物件,當程式中呼叫物件的某個函式時,有可能要訪問到這個物件的成員變數。而對於同一個類的每一個物件,都是共享同一份類函式。物件有單獨的變數,但是沒有單獨的函

C++ this 指標的用法詳解

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

C++this指標的詳解:

成員函式中this是指向正在呼叫該函式的物件,this指正在建立物件內部的成員。同一個類中的函式可以通過this相互呼叫,普通函式不能通過this呼叫建構函式,但建構函式可以通過this訪問普通函式!.h檔案ifndef TEACHER_H_#define TEACHER_H

C++成員變數和成員指標變數小結

指標的確有點難理解,不過它之所以存在並大範圍使用,這樣做是有一定道理的。 一、C++中的類和結構使用指標定義成員作用 1、多型的要求。 如果要使用同一介面,多型設計,那麼就一定要使用基類指標。只有指標才能在實力化後動態的判斷使用哪個方法。2、程式碼複用。有一些程式要設計

C++指標成員的管理(值型、智慧指標)

在使用C++類的時候免不了會遇到類中需要指標成員的時候,但類成員裡面一出現指標就 很容易一不小心碰上各種各樣的麻煩,尤其需要注意的是類物件的初始化和賦值,下面 總結了一些常見解決辦法。 先來看看這樣一個類: #include <iostream&g

C++的特殊成員函數-------復制構造函數

code amp 默認 tdi blog 復制構造函數 stat int ios   在C++中存在一個特殊函數,他就是復制構造函數,假如我們有類A,如果有A a;A b=a; 在這種情況下利用A類變量a來給同是A類變量的b來賦值,這個時候類會使用復制構造函數,如果我們

[原創]c# Collection 字段初始化的特殊之處

朋友 gpo eal customer tom 不理解 fig return names 1.今天看一下StackExchange.Redis的源代碼,裏面有這樣一段代碼 public sealed class ConfigurationOptions : ICl