簡體   English   中英

“ this”指針如何用作成員函數的參數

[英]How is the 'this' pointer used as an argument of a member function

我有這個簡單的課程

class foo {
public:
  void func() const;
  void func2();
};

void foo::func() const {}
void foo::func2() {}

int main() {
  const foo f;
  f.func();
  f.func2();
}

當我嘗試編譯時,出現以下消息:

錯誤:將“ const foo”作為“ void foo :: func2()”的“ this”參數傳遞會丟棄限定符[-fpermissive]

我了解const對象的非const成員的用法,我的問題是“ this”指針如何用作func2的參數?

void foo::func2()是非const的,這意味着它可能會更改對象。 因此,編譯器不允許您為const對象調用它。 即使您實際上並未更改func2的實現中的任何內容。 對於任何非靜態成員函數, this都是隱式參數。 這就是它知道要調用的對象的確切方式。

9.3.2 this指針[class.this]

1在非靜態(9.3)成員函數的主體中,關鍵字this是一個prvalue表達式,其值是為其調用該函數的對象的地址。

您將看到C ++定義方式的產物。 成員函數會自動向每個函數添加一個隱藏的this參數。 如果對象是const則指針也為const ,並且非const成員函數必須接收this指針為非const。

成員函數的實例參數是隱式的 也就是說,它從來都不是函數聲明的一部分,但是仍然存在。

請記住,(非靜態)成員函數不是函數。 您不能只打電話給他們。 相反,您必須始終在實例對象上調用它們。 該實例對象是成員函數的隱式參數,但從未明確說明。 可通過this表達式在函數內部使用。

如果隱式instance參數結合到恆定對象,那么類型thisT const * ,以及僅被限定為成員函數const可以被調用。 volatile類似,也有類似的規則將隱式實例參數綁定到右值引用。

您不能在const對象f上調用非const函數func2

由於您的問題是:

this指針如何用作func2的參數

以下是IBM C ++文檔中引用的一些信息:this指針

關鍵字this標識一種特殊的指針類型。 假設您創建一個名為x的類A的對象,並且類A具有一個非靜態成員函數f() 如果調用函數xf() ,則f()主體中的關鍵字this將存儲x的地址。 您不能聲明此指針或對其進行賦值。

static成員函數沒有this指針。

類類型X的成員函數的this指針的類型為X* const 如果用const限定符聲明成員函數,則類X該成員函數的this指針的類型為const X* const

const this指針只能與const member functions 類的數據成員在該函數內將保持不變。 該函數仍然可以更改該值,但需要const_cast才能執行此操作:

 void foo::p() const{ member = 1; // illegal const_cast <int&> (member) = 1; // a bad practice but legal } 

更好的技術是聲明成員可變

在OOP中(通常),所有實例方法都由編譯器靜默轉換為靜態函數,並且將包含實例狀態(即this )的結構的指針添加為隱藏的第一個參數。

所以這:

class Foo
{
    private:
        Int32 _bar;

    public:
        void Add(Int32 x)
        {
            this->_bar += x;
        }
};

void Main()
{
    Foo foo;
    foo.Add(3);
}

實際上是這樣實現的:

struct Foo {
    Int32 _bar;
}

static void Foo_Add(Foo *thisPtr, Int32 x)
{
    thisPtr->_bar += x;
}

void Main()
{
    Foo foo;
    Foo_Add( &foo, 3 );
}

您的成員函數func2()應該為const。 這里

在計算機上運行的實際代碼中, func2的代碼需要知道要查看/執行操作的foo實例。 因此,它傳遞了一個指向實例的指針( this )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM