Hàm Bạn Và Lớp Bạn Trong C++

0
2045
Bài số 5 trong 10 bài của series Hướng đối tượng C++

Chào mọi người, trong bài trước thì mình đã hướng dẫn mọi người viết một class đơn giản. Trong phần tiếp theo, chúng ta cùng đi tìm hiểu hàm bạn là gì? Lớp bạn là gì nhé?

Đặt vấn đề cần truy cập dữ liệu

Giả sử ta có class sinhvien có thuộc tính masinhvienprivate. Ta cũng có class giangvien có thuộc tính magiangvien là private.
Yêu cầu là chỉ dùng một hàm để in 2 giá trị thuộc tính này ra.

Đối với hàm get() này:

  • Không thể thuộc lớp sinhvien
  • Không thể thuộc lớp giangvien
  • Cũng không thể là một hàm tự do (vì hàm không thuộc class sẽ không truy cập thuộc tính private)

Nếu không nhớ các quyền truy cập private, protected, public các bạn có thể xem lại TẠI ĐÂY

Hàm bạn (friend function) trong C++

Hàm Bạn

Định nghĩa

  • Hàm bạn trong c++ là hàm tự do, không thuộc lớp. Tuy nhiên hàm bạn trong c++ có quyền truy cập các thành viên private của lớp.
  • Một lớp trong c++ có thể có nhiều hàm bạn, và chúng phải nằm bên ngoài class.

Ưu điểm

  • Kiểm soát các truy nhập ở cấp độ lớp. Nghĩa là không thể áp đặt hàm bạn cho một lớp, nếu như chưa khai báo hàm bạn trong lớp.
  • Giải quyết được vấn đề cần truy cập dữ liệu của lớp như trên.

Cú pháp

Đặt từ khoá friend phía trước, sau đó khai báo như một hàm thông thường

Ví dụ:

Ta truyền Input:

Sau khi chạy chương trình ta sẽ nhận được kết quả là:

Lớp bạn (class function) trong C++

Lớp Bạn

Tương tự như hàm bạn, lớp bạn ( friend class ) trong C++ cũng cho phép lớp bạn của lớp kia truy cập các thành viên private

Tính chất và mối quan hệ của lớp bạn

  • Khai báo lớp A là bạn của lớp B không có nghĩa lớp B là bạn của lớp A (chỉ có tính 1 chiều). Điều đó có nghĩa là chỉ có lớp A truy cập được thành viên của lớp B, nhưng ngược lại lớp B không thể truy cập ngược lại của lớp A.
  • Không đối xứng.
  • Không bắc cầu.

Cú pháp

Ta cũng dùng từ khoá friend để khai báo giống như khai báo hàm bạn.

Như trong ví dụ trên, ta đã khai báo lớp B là bạn của lớp A, do đó lớp B có thể truy cập các thành viên trong lớp A ( Trong ví dụ là truy cập lớp A thông qua  Change(A obj) ).
Hãy thật lưu ý trong ví dụ trên B là bạn của A, B có thể truy cập vào A nhưng ngược lại thì không nhé.

Cảm ơn mọi người đã theo dõi và ủng hộ series của mình. Mình rất mong nhận được những ý kiến, đóng góp của các bạn để bài viết của mình ngày càng hoàng thiện hơn. Cảm ơn tất cả mọi người.

Các bài viết trong SeriesBài trước: Tạo Class Trong C++Bài sau: Nạp Chồng Hàm Và Nạp Chồng Toán Tử

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây