[英]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
都是隱式參數。 這就是它知道要調用的對象的確切方式。
1在非靜態(9.3)成員函數的主體中,關鍵字this是一個prvalue表達式,其值是為其調用該函數的對象的地址。
您將看到C ++定義方式的產物。 成員函數會自動向每個函數添加一個隱藏的this
參數。 如果對象是const
則指針也為const
,並且非const成員函數必須接收this
指針為非const。
成員函數的實例參數是隱式的 。 也就是說,它從來都不是函數聲明的一部分,但是仍然存在。
請記住,(非靜態)成員函數不是函數。 您不能只打電話給他們。 相反,您必須始終在實例對象上調用它們。 該實例對象是成員函數的隱式參數,但從未明確說明。 可通過this
表達式在函數內部使用。
如果隱式instance參數結合到恆定對象,那么類型this
是T 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.