Hàm bạn (friend function) trong lập trình hướng đối tượng với C++

Đây là bài 10/19 bài của series môn học Phương pháp lập trình hướng đối tượng

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.

Mời bạn đánh giá bài viết
Bài trước và bài sau trong môn học<< Các thành phần tĩnh (static member) trong lớp (class)Nạp chồng toán tử (operator overloading) trong C++ >>
Chia sẻ trên mạng xã hội:

Tác giả Vinh Lê

Vinh Lê hiện đang là biên tập viên tại Góc Học IT.

Bài viết của Vinh Lê

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.