1. Hàm bạn (friend function) là gì?
Ngôn ngữ C++ có một hàm rất đặc biệt gọi là hàm bạn (friend function). Hàm bạn là loại hàm không phải là hàm thành viên của một lớp nhưng có thể truy cập vào các thành phần (kể cả private và public) của lớp đó.
Để một hàm trở thành bạn của một lớp, có 2 cách viết:
Cách 1: Dùng từ khóa friend
để khai báo hàm trong lớp và định nghĩa hàm bên ngoài lớp.
class Tên_lớp{
private: //Khai báo các thuộc tính
public:
...
//Khai báo các hàm bạn của lớp Tên_lớp
friend void hàm1(Các_tham_số);
friend int hàm2(Các_tham_số);
...
};
//Định nghĩa các hàm bạn
void hàm1(Các_tham_số){
...
}
int hàm2(Các_tham_số){
...
}
Cách 2: Dùng từ khóa friend
để định nghĩa hàm trong lớp.
class Tên_lớp{
private://Khai báo các thuộc tính
public:
...
//Khai báo các hàm bạn của lớp Tên_Lớp
friend void hàm1(Các_tham_số){
...
}
friend int hàm2(Các_tham_số){
...
}
};
Hàm bạn tuy không phải là hàm thành phần của lớp nhưng có thể truy cập tới các thuộc tính của đối tượng thuộc lớp.
Một hàm có thể là bạn của nhiều lớp. Lúc đó, nó có quyền truy cập tới tất cả các thuộc tính của các đối tượng trong các lớp này. Để một hàm trở thành bạn của các lớp A, B và C, ta viết như sau:
//Trước hết, phải khai báo các lớp
class A; //Khai báo lớp A
class B; //Khai báo lớp B
class C; //Khai báo lớp C
//Định nghĩa lớp A
class A{
//Khai báo hàm của A
friend void tên_hàm_bạn(Các_tham_số);
};
//Định nghĩa lớp B
class B{
//Khai báo hàm bạn của B
friend void tên_hàm_bạn(Các_tham_số);
};
//Định nghĩa lớp C
class C{
//Khai báo hàm bạn của C
friend void tên_hàm_bạn(Các_tham_số);
};
//Xây dựng hàm bạn
void tên_hàm_bạn(Các_tham_số){
//Thân hàm
};
2. Ví dụ sử dụng hàm friend
Cộng các thành viên của hai lớp khác nhau sử dụng hàm bạn.
#include <iostream>
using namespace std;
class A; //Khai báo lớp A
class B; //Khai báo lớp B
//Định nghĩa lớp A
class A{
private:
int numA;
public:
A(int a){
numA = a;
}
//Khai báo hàm cong là bạn của A
friend int cong(A, B);
};
//Định nghĩa lớp B
class B{
private:
int numB;
public:
B(int b){
numB = b;
}
//Khai báo hàm cong là bạn của B
friend int cong(A, B);
};
//Hàm cong() là hàm bạn của lớp A và B, có thể truy cập thành viên numA và numB
int cong(A a, B b){
return (a.numA + b.numB);
}
void main()
{
A a(10);
B b(20);
cout<<"Tong: "<<cong(a, b);
system("pause");
}
Kết quả
Tong: 30
3. Lớp bạn (friend class) là gì?
Chúng ta cũng có thể khai báo lớp bạn của một lớp trong C++ với từ khóa friend. Ví dụ:
class ClassB;
class ClassA {
// ClassB is a friend class of ClassA
friend class ClassB;
... .. ...
}
class ClassB {
... .. ...
}
Khi một lớp có lớp bạn thì tất cả hàm thành viên của lớp bạn sẽ trở thành hàm bạn của lớp đó.
Trong ví dụ trên, ClassB là lớp bạn của lớp ClassA, chúng ta có thể truy cập tất cả thành viên của lớp ClassA trong lớp ClassB. Nhưng nên nhớ, không thể truy cập các thành viên của lớp ClassB trong lớp ClassA.
// C++ program to demonstrate the working of friend class
#include <iostream>
using namespace std;
// forward declaration
class ClassB;
class ClassA {
private:
int numA;
// friend class declaration
friend class ClassB;
public:
// constructor to initialize numA to 12
ClassA() : numA(12) {}
};
class ClassB {
private:
int numB;
public:
// constructor to initialize numB to 1
ClassB() : numB(1) {}
// member function to add numA
// from ClassA and numB from ClassB
int add() {
ClassA objectA;
return objectA.numA + numB;
}
};
int main() {
ClassB objectB;
cout << "Sum: " << objectB.add();
return 0;
}
Kết quả
Sum: 13
Lớp ClassB là lớp bạn của ClassA, chúng ta cũng có thể tạo các đối tượng của ClassA trong lớp ClassB.