[C/C++] Toán tử pointer-to-member

Như chúng ta đã biết con trỏ là biến chứa địa chỉ. Con trỏ có thể trỏ đến địa chỉ của 1 biến, hoặc 1 hàm (con trỏ hàm), khi đó ta có thể gán hoặc truy xuất giá trị tại địa chỉ đó thông qua con trỏ.

Ví dụ:


int val = 10;

int *ptr = &val;

*ptr = 20;

Với các thành phần của class thì sao?

Chúng ta cũng sẽ có thể định nghĩa con trỏ để trỏ đến thành phần của class. Ta sẽ lần lượt tìm hiểu về cách định nghĩa cũng như sử dụng con trỏ trỏ tới các thành phần của class.

Con trỏ tới biến thành viên (Pointer to Data Members).

Cú pháp

datatype class_name::*pointer_name;
pointer_name = &class_name::datamember_name;

Hoặc

datatype class_name::*pointer_name = &class_name::datamember_name;

Sử dụng con trỏ với đối tượng Đề truy cập đến các thành phần của class ta dùng toán từ ‘.’ đối với đối tượng và toán tử ‘->’ với con trỏ trỏ đến đối tượng. Với con trỏ trỏ tới biến thành viên của class ta sử dụng dereference của con trỏ để truy cập đến địa chỉ nó trỏ tới. Khi đó để truy cập đến con trỏ trỏ tới biến thành viên ta sử dụng.

object.*pointerToMember

Và với con trỏ của đối tượng

ObjectPointer->*pointerToMember

Ví dụ:


#include <iostream>

#include <string>

using namespace std;

class Test

{

public:

   int m_val;

   Test() : m_val(20)

   {
      //TODO
   }

};

//Khai báo con trỏ trỏ tới biến m_val
int Test::*ptr = &Test::m_val;

int main()

{

   Test t;

   cout << "t.*ptr = " << t.*ptr << endl;

   //Sử dụng biến con trỏ thay đổi giá trị
   t.*ptr = 50;

   cout << "m_val = " << t.m_val << endl;

   return 0;

}

Kết quả:

t.*ptr = 20
m_val = 50

Con trỏ tới hàm thành viên (Pointer to member function)

Con trỏ trỏ tới địa chỉ của 1 hàm được gọi là con trỏ hàm.

Xem lại bài về con trỏ hàm : Nạp chồng hàm, con trỏ hàm và tham số mặc định trong C++

Ta cũng có thể khai báo 1 con trỏ hàm trỏ tới hàm thành viên của class.

Cú pháp:

return_type (class_name::*ptr_name) (argument_type) = &class_name::function_name;

Sử dụng con trỏ tới hàm thành viên.

Với object

(object.*ptr_name) (argument);

Với con trỏ của đối tượng.

(objectPointer->*ptr_name) (argument);

Ví dụ:


#include <iostream>

#include <string>

using namespace std;

class Test

{

public:

   int m_val;

   Test() : m_val(20) 

   { 
      //TODO
   }

   void Display()

   {

      cout << "m_val = " << m_val << endl;

   }

};

//Khai báo con trỏ trỏ tới biến m_val
int Test::*ptr = &Test::m_val;

//Khai báo con trỏ hàm trỏ tới hàm Display
void (Test::*ptrDisplay) () = &Test::Display;

int main()

{

   Test t; t.*ptr = 50;

   (t.*ptrDisplay)();

   return 0;

}

Kết quả:

m_val = 50

Có 1 bình luận

Leave A Comment?