欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++編程指向成員的指針以及this指針的基本使用指南

 更新時間:2016年01月22日 16:40:33   投稿:goldensun  
這篇文章主要介紹了C++編程指向成員的指針以及this指針的基本使用指南,與C語言一樣,存儲的數值被解釋成為內存里的一個地址,需要的朋友可以參考下

指向成員的指針
指向成員的指針的聲明是指針聲明的特例。使用以下序列來聲明它們:

[storage-class-specifiers] [cv-qualifiers] type-specifiers [ms-modifier]
qualified-name ::* [cv-qualifiers] identifier
[= & qualified-name :: member-name];

聲明說明符:

  • 可選存儲類說明符。
  • 可選 const 和/或 volatile 說明符。
  • 類型說明符:類型的名稱。這是要指向的成員的類型,而不是類。

聲明符:

  • 可選的 Microsoft 專用修飾符。
  • 包含要指向的成員的類的限定名。
  • :: 運算符。
  • * 運算符。
  • 可選 const 和/或 volatile 說明符。
  • 命名指向成員的指針的標識符。

可選的初始值設定項:

  • = 運算符。
  • & 運算符。
  • 類的限定名。
  • :: 運算符。
  • 適當類型的類的非靜態(tài)成員的名稱。

像往常一樣,允許在單個聲明中使用多個聲明符(以及任何關聯(lián)的初始值設定項)。
指向類的成員的指針與普通指針不同,因為它有該成員的類型的類型信息和該成員所屬的類的類型信息。常規(guī)指針只標識內存中的一個對象或只具有其地址。指向類的某個成員的指針標識類的所有實例中的該成員。以下示例聲明類、Window 和一些指向成員數據的指針。

// pointers_to_members1.cpp
class Window
{
public:
 Window();        // Default constructor.
 Window( int x1, int y1,     // Constructor specifying
 int x2, int y2 );      // window size.
bool SetCaption( const char *szTitle ); // Set window caption.
 const char *GetCaption();    // Get window caption.
 char *szWinCaption;      // Window caption.
};

// Declare a pointer to the data member szWinCaption.
char * Window::* pwCaption = &Window::szWinCaption;
int main()
{
}

在前面的示例中,pwCaption 是一個指針,它指向具有 Windowchar* 類型的類 的任何成員。類型 pwCaption 不是 char * Window::*。下一個代碼片段將指針聲明為 SetCaption 和 GetCaption 成員函數。

const char * (Window::*pfnwGC)() = &Window::GetCaption;
bool (Window::*pfnwSC)( const char * ) = &Window::SetCaption;

指針 pfnwGC 和 pfnwSC 分別指向 GetCaption 類的 SetCaption 和 Window。以下代碼直接使用指向成員 pwCaption 的指針將信息復制到窗口標題:

Window wMainWindow;
Window *pwChildWindow = new Window;
char *szUntitled = "Untitled - ";
int cUntitledLen = strlen( szUntitled );

strcpy_s( wMainWindow.*pwCaption, cUntitledLen, szUntitled );
(wMainWindow.*pwCaption)[cUntitledLen - 1] = '1';  //same as
//wMainWindow.SzWinCaption [cUntitledLen - 1] = '1';
strcpy_s( pwChildWindow->*pwCaption, cUntitledLen, szUntitled ); 
(pwChildWindow->*pwCaption)[cUntitledLen - 1] = '2'; //same as //pwChildWindow->szWinCaption[cUntitledLen - 1] = '2';

.* 和 –>* 運算符(指向成員的指針運算符)的區(qū)別在于 .* 運算符選擇成員給定的對象或對象引用,而 –>* 運算符通過指針選擇成員。(有關這些運算符的更多信息,請參閱使用指向成員的指針運算符的表達式。)
指向成員的指針運算符的結果是成員的類型 - 本例中為 char *。
以下代碼片段使用指向成員的指針調用成員函數 GetCaption 和 SetCaption:

// Allocate a buffer.
enum {
 sizeOfBuffer = 100
};
char szCaptionBase[sizeOfBuffer];

// Copy the main window caption into the buffer
// and append " [View 1]".
strcpy_s( szCaptionBase, sizeOfBuffer, (wMainWindow.*pfnwGC)() );
strcat_s( szCaptionBase, sizeOfBuffer, " [View 1]" );
// Set the child window's caption.
(pwChildWindow->*pfnwSC)( szCaptionBase );

針對指向成員的指針的限制
靜態(tài)成員的地址不是指向成員的指針。它是指向靜態(tài)成員的一個實例的常規(guī)指針。由于給定類的所有對象只存在一個靜態(tài)成員實例,因此可以使用普通的 address-of (&) 和取消引用 (*) 運算符。
指向成員和虛函數的指針
通過指向成員函數的指針調用虛函數就如同直接調用函數一樣;將在 v 表中查找并調用正確的函數。
一直以來,虛函數工作的關鍵是通過指向基類的指針來調用它們。(有關虛函數的詳細信息,請參閱虛函數。)
以下代碼演示如何通過指向成員函數的指針調用虛函數:

// virtual_functions.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

class Base
{
public:
virtual void Print();
};
void (Base ::* bfnPrint)() = &Base :: Print;
void Base :: Print()
{
cout << "Print function for class Base\n";
}

class Derived : public Base
{
public:
void Print(); // Print is still a virtual function.
};

void Derived :: Print()
{
cout << "Print function for class Derived\n";
}

int main()
{
 Base *bPtr;
 Base bObject;
Derived dObject;
bPtr = &bObject; // Set pointer to address of bObject.
(bPtr->*bfnPrint)();
bPtr = &dObject; // Set pointer to address of dObject.
(bPtr->*bfnPrint)();
}

//Output: Print function for class Base
Print function for class Derived

this 指針
this 指針是只能在 class、struct或 union 類型的非靜態(tài)成員函數中訪問的指針。它指向為其調用成員函數的對象。靜態(tài)成員函數沒有 this 指針。
語法

  this 
this->member-identifier

備注
對象的 this 指針不是對象的一部分;它沒有在對象上的 sizeof 語句的結果中反映。相反,當對某個對象調用非靜態(tài)成員函數時,該對象的地址將由編譯器作為隱藏的參數傳遞給函數。例如,以下函數調用:

myDate.setMonth( 3 );

可以按以下方式解釋:

setMonth( &myDate, 3 );

對象的地址可從成員函數的內部作為 this 指針提供。 this 的大多數使用都是隱式的。在引用類的成員時顯式使用 this 是合法的,但沒有必要。例如:

void Date::setMonth( int mn )
{
 month = mn;   // These three statements
 this->month = mn;  // are equivalent
 (*this).month = mn;
}

表達式 *this 通常用于從成員函數返回當前對象:

return *this;

this 指針還用于防止自引用:

if (&Object != this) {
// do not execute in cases of self-reference

注意
由于 this 指針無法更改,因此不允許對 this 賦值。C++ 的早期實現允許對 this 賦值。
this 指針有時可直接使用 - 例如,當操作自引用數據結構,而其中需要當前對象的地址時。

// this_pointer.cpp
// compile with: /EHsc

#include <iostream>
#include <string.h>

using namespace std;

class Buf 
{
public:
 Buf( char* szBuffer, size_t sizeOfBuffer );
 Buf& operator=( const Buf & );
 void Display() { cout << buffer << endl; }

private:
 char* buffer;
 size_t sizeOfBuffer;
};

Buf::Buf( char* szBuffer, size_t sizeOfBuffer )
{
 sizeOfBuffer++; // account for a NULL terminator

 buffer = new char[ sizeOfBuffer ];
 if (buffer)
 {
  strcpy_s( buffer, sizeOfBuffer, szBuffer );
  sizeOfBuffer = sizeOfBuffer;
 }
}

Buf& Buf::operator=( const Buf &otherbuf ) 
{
 if( &otherbuf != this ) 
 {
  if (buffer)
   delete [] buffer;

  sizeOfBuffer = strlen( otherbuf.buffer ) + 1; 
  buffer = new char[sizeOfBuffer];
  strcpy_s( buffer, sizeOfBuffer, otherbuf.buffer );
 }
 return *this;
}

int main()
{
 Buf myBuf( "my buffer", 10 );
 Buf yourBuf( "your buffer", 12 );

 // Display 'my buffer'
 myBuf.Display();

 // assignment opperator
 myBuf = yourBuf;

 // Display 'your buffer'
 myBuf.Display();
}

輸出:

my buffer
your buffer

this 指針的類型
通過 const 和 關鍵字,可以在函數聲明中修改 volatilethis 指針的類型。若要將函數聲明為具有一個或多個關鍵字的特性,請將關鍵字添加到函數參數列表的后面。
請看以下示例:

// type_of_this_pointer1.cpp
class Point
{
 unsigned X() const;
};
int main()
{
}

上面的代碼聲明一個成員函數 X,其中,this 指針被視為指向 const 對象的 const 指針??梢允褂?cv-mod-list 選項的組合,但它們始終通過 this 修改指向的對象,而不是 this 指針本身。因此,以下聲明將聲明函數 X;this 指針是指向 const 對象的 const 指針:

// type_of_this_pointer2.cpp
class Point
{
 unsigned X() const;
};
int main()
{
}

成員函數中 this 指針的類型由以下語法描述,其中,cv-qualifier-list 是從成員函數聲明符中確定的,可以是 const 和/或 volatile,而 class-type 是類的名稱:

[cv-qualifier-list] class-type * const this

換言之,this 始終是 const 指針;無法重新指派它。成員函數聲明中使用的 const 或 volatile 限定符適用于由該函數范圍中的 this 指向的類實例。
下表介紹了有關這些修飾符的工作方式的更多信息。
this 修飾符的語義

修飾符
含義
const 不能更改數據成員;無法調用不是 const 的成員函數。
volatile 每次訪問成員數據時,都會從內存中加載該數據;禁用某些優(yōu)化。

將 const 對象傳遞給不是 const 的成員函數是錯誤的。同樣,將 volatile 對象傳遞給不是 volatile 的成員函數也是錯誤的。
聲明為 const 的成員函數不能更改數據成員 - 在此類函數中,this 指針是指向 const 對象的指針。
注意
構造函數和析構函數不能聲明為 const 或 volatile。但是,可以在 const 或 volatile 對象上調用它們。

相關文章

  • C++實現統(tǒng)計代碼運行時間的示例詳解

    C++實現統(tǒng)計代碼運行時間的示例詳解

    這篇文章主要為大家詳細介紹了C++一個有趣的小項目——統(tǒng)計代碼運行時間,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-05-05
  • C語言實現三子棋游戲簡易版

    C語言實現三子棋游戲簡易版

    這篇文章主要為大家詳細介紹了C語言實現三子棋游戲簡易版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 構造函數不能聲明為虛函數的原因及分析

    構造函數不能聲明為虛函數的原因及分析

    構造函數不需要是虛函數,也不允許是虛函數,因為創(chuàng)建一個對象時我們總是要明確指定對象的類型,盡管我們可能通過實驗室的基類的指針或引用去訪問它但析構卻不一定,我們往往通過基類的指針來銷毀對象
    2013-10-10
  • VC++中的字體設置方法詳解

    VC++中的字體設置方法詳解

    以下是對VC++中的字體設置方法進行了詳細的介紹,需要的朋友可以過來參考下
    2013-09-09
  • C++實現高校教室管理系統(tǒng)

    C++實現高校教室管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現高校教室管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++ vector類的模擬實現方法

    C++ vector類的模擬實現方法

    這篇文章主要介紹了C++ vector類的模擬實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • C++設計模式之狀態(tài)模式

    C++設計模式之狀態(tài)模式

    這篇文章主要介紹了C++設計模式之狀態(tài)模式,本文講解了什么是狀態(tài)模式、狀態(tài)模式的使用場合、狀態(tài)模式的實現代碼等內容,需要的朋友可以參考下
    2014-10-10
  • C語言每日練習之二叉堆

    C語言每日練習之二叉堆

    這篇文章主要為大家介紹了C語言二叉堆,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言示例講解while循環(huán)語句的用法

    C語言示例講解while循環(huán)語句的用法

    在不少實際問題中有許多具有規(guī)律性的重復操作,因此在程序中就需要重復執(zhí)行某些語句。一組被重復執(zhí)行的語句稱之為循環(huán)體,C語言while語句可以是單個語句,也可以是一個語句塊,其條件可以是任意表達式,true是任意非零值,當條件為真時,循環(huán)進行迭代
    2022-06-06
  • 下標操作符重載模擬多維數組詳解

    下標操作符重載模擬多維數組詳解

    雖然不能直接實現一對下標操作符重載,但是我們可以間接模擬。思路是這樣的,先通過單下標操作返回一個具有下標操作能力的左值,對左值進行下標操作,兩個下標操作表達式聯(lián)立就實現了雙下標操作
    2013-09-09

最新評論