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 masinhvien
là private. 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++
Đị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ụ:
#include <bits/stdc++.h> using namespace std; class giangvien; class sinhvien { private: string masinhvien; public: sinhvien() { this->masinhvien = ""; } ~sinhvien() { this->masinhvien = ""; } void set() { cout << "Nhap Ma Sinh Vien"; fflush(stdin); getline(cin, this->masinhvien); } friend void get(sinhvien a, giangvien b); // Khai báo hàm bạn trong class }; class giangvien { private: string magiangvien; public: giangvien() { this->magiangvien = ""; } ~giangvien() { this->magiangvien = ""; } void set() { cout << "Nhap Ma Giang Vien: "; fflush(stdin); getline(cin, this->magiangvien); } friend void get(sinhvien a, giangvien b); // Khai báo hàm bạn trong class }; void get(sinhvien a, giangvien b) { cout << "Ma Sinh Vien: " << a.masinhvien << endl; cout << "Ma Giang Vien: " << b.magiangvien << endl; } int main() { sinhvien a; giangvien b; a.set(); b.set(); get(a,b); }
Ta truyền Input:
MSV001 MGV001
Sau khi chạy chương trình ta sẽ nhận được kết quả là:
Ma Sinh Vien: MSV001 Ma Giang Vien: MGV001
Lớp bạn (class function) trong C++
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.
class A { private: int i; public: friend class B; //Có lớp bạn là B }; class B { public: void Change(A obj) { obj.i++; } };
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.
Để lại một bình luận