83 / 100
Bạn đang đọc: Hàm Bạn Và Lớp Bạn Trong C++
This entry is part 5 of 10 in the series Hướng đối tượng người dù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 thuần. Trong phần tiếp theo, tất cả chúng ta cùng đi khám phá hàm bạn là gì ? Lớp bạn là gì nhé ?
Tóm Tắt
Đặ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ớ những quyền truy vấn private, protected, public những bạn hoàn toà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ụ :
0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
#include usingnamespacestd; classgiangvien; classsinhvien { private: stringmasinhvien; public: sinhvien() { this->masinhvien=” “; } ~sinhvien() { this->masinhvien=” “; } voidset() { cout<<" Nhap Ma Sinh Vien ";fflush(stdin);getline(cin,this->masinhvien); } friendvoidget(sinhviena,giangvienb);/ / Khai báo hàm bạn trong class }; classgiangvien { private: stringmagiangvien; public: giangvien() { this->magiangvien=” “; } ~giangvien() { this->magiangvien=” “; } voidset()
{ cout<<" Nhap Ma Giang Vien : ";fflush(stdin);getline(cin,this->magiangvien); } friendvoidget(sinhviena,giangvienb);/ / Khai báo hàm bạn trong class }; voidget(sinhviena,giangvienb) { cout<<" Ma Sinh Vien : "< cout<<" Ma Giang Vien : "< } intmain() { sinhviena; giangvienb; a.set();b.set(); get(a,b); } |
Ta truyền Input :
0123 | MSV001MGV001 |
Sau khi chạy chương trình ta sẽ nhận được hiệu quả là :
0123 | Ma Sinh Vien : MSV001Ma 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.
0123456789101112131415161718 |
classA { private: inti; public: friendclassB;/ / Có lớp bạn là B }; classB { public: voidChange(Aobj) { 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 quan điểm, góp phần của những bạn để bài viết của mình ngày càng hoàng thiện hơn. Cảm ơn tổng thể mọi người .
Source: https://final-blade.com
Category: Kiến thức Internet