[OOP] Hàm bạn (friend function) và lớp bạn (friend class)

Hàm bạn (friend function)

Hàm bạn là hàm không phải thành viên của class nhưng có thể truy cập được các thành phần private của class.

Xem lại phạm vi truy cập các thành phần của class tại: Các thành phần trong class

Để định nghĩa hàm bạn ra sử dụng từ khóa friend trước khai báo hàm bên trong class.

Ví dụ:


#include <iostream>

using namespace std;

class Test

{

private:

   int m_val;

public:

   void SetVal(int val)

   {

      this->m_val = val;

   }

   void Display() const

   {

      cout << "m_val = " << this->m_val << endl;

   }

   friend void ResetValue(Test& t);

};

void ResetValue(Test& t)

{

   t.m_val = 0;

}

int main()

{

   Test t;

   t.SetVal(40);

   t.Display();

   ResetValue(t);

   t.Display();

   return 0;

}

Kết quả:

m_val = 40
m_val = 0

Hàm ResetValue là hàm bạn của class Test. Mặc dù không phải là hàm thành viên của class Test hàm ResetValue vẫn có thể truy cập và gán giá trị cho biến private (m_val). Vì ResetValue không thuộc class nên ta gọi như hàm global bình thường mà không cần thông qua đối tượng nào.

Vì hàm bạn không thuộc class nên ta không thể sử dụng con trỏ this trong hàm bạn.

Xem lại về con trỏ this tại : Con trỏ this trong C++

Một hàm có thể là bạn của nhiều class.

Ví dụ:


#include <iostream>

#include <string>

using namespace std;

class Address;

class Person

{

private:

   string  m_name;

public:

   Person(string name)

   {

      m_name = name;

   }

   friend void PrintData(Person& person, Address& addr);

};

class Address

{

private :

   string m_city;

public:

   Address(string city)

   {

      m_city = city;

   }

   friend void PrintData(Person& person, Address& addr);

};

void PrintData(Person& person, Address& addr)

{

   cout << "My name is " << person.m_name << endl;

   cout << "I live in " << addr.m_city << endl;

}

int main()

{

   Person p("noname");

   Address addr("Ha Noi");

   PrintData(p, addr);

   return 0;

}

Kết quả:

My name is noname
I live in Ha Noi

Lớp bạn (Friend classes)

Ta có thể khai báo 1 class là bạn của 1 class khác.

Khi đó tất các các thành phần của class bạn có thể truy cập đến các thành phần private của class khác đó.

Ví dụ:


#include <iostream>

#include <string>

using namespace std;

class Person

{

private:

   string  m_name;

   string m_address;

public:

   Person(string name, string addr)

   {

      m_name = name;

      m_address = addr;

   }

   friend class Display;

};

class  Display

{

public:

   void PrintData(Person& p)

   {

      cout << "My name is " << p.m_name << endl;

      cout << "I live in " << p.m_address << endl;

   }

};

int main()

{

   Person p("noname", "Ha Noi");

   Display display;

   display.PrintData(p);

   return 0;

}

Kết quả:

My name is noname
I live in Ha Noi

Hàm bạn thành viên (Friend member function)

Thay vì cho cả class là bạn của class khác ta có thể cho 1 hàm thành viên của class là bạn của class khác.

Ví dụ:


#include <iostream>

#include <string>

using namespace std;

//forward declaration class Person
class Person;

class  Display

{

public:

   void PrintData(Person& p);

};

class Person

{

private:

   string  m_name;

   string m_address;

public:

   Person(string name, string addr)

   {

      m_name = name;

      m_address = addr;

   }

   friend void Display::PrintData(Person& p);

};

void Display::PrintData(Person& p)

{

   cout << "My name is " << p.m_name << endl;

   cout << "I live in " << p.m_address << endl;

}

int main()

{

   Person p("noname", "Ha Noi");

   Display display;

   display.PrintData(p);

   return 0;

}

Kết quả:

My name is noname
I live in Ha Noi

Was this article helpful?

Leave A Comment?