Dùng Hàm Bạn Và Lớp Bạn Trong C++ Như Thế Nào?
Trong class các thuộc tính hay phương thức trong phạm vi private
không thể truy cập được bên ngoài class
, vậy muốn truy xuất nó ở bên ngoài class ta phải làm như thế nào? Để trả lời câu hỏi đó các bạn cùng mình theo dõi bài viết ngày hôm nay nhé.
1. Hàm bạn (Friend Function) là gì?
Hàm bạn của một lớp không phải là hàm thành viên nên nó không phụ thuộc vào lớp và có thể định nghĩa ở trong hoặc ngoài lớp
Hàm bạn có thể truy cập trực tiếp các thành viên private và một lớp có thể có nhiều hàm bạn
Cú pháp khai báo hàm bạn đơn giản là thêm từ khóa friend
trước hàm bình thường ta vẫn sử dụng
Ví dụ cụ thể:
#include <bits/stdc++.h>
using namespace std;
class TamGiac{
private:
int a,b,c;
public:
TamGiac()
{
a = 1;
b = 1;
c = 1;
}
TamGiac(int a, int b, int c): a(a), b(b), c(c) {};
friend bool kiemTraTG(TamGiac tg);
friend ostream& operator << (ostream &os ,TamGiac &tg)
{
os<<"a = "<<tg.a<<" b = "<<tg.b<<" c = "<<tg.c<<endl;
return os;
}
};
bool kiemTraTG(TamGiac tg)
{
if(tg.a>0 && tg.b>0 && tg.c>0 && (tg.a+tg.b>tg.c) && (tg.a+tg.c>tg.b) && (tg.b+tg.c>tg.a))
return true;
return false;
}
int main()
{
TamGiac t(3,4,5);
cout<<kiemTraTG(t);
cout<<t;
return 0;
}
Ví dụ trên mình minh họa lớp tam giác có các thuộc tính là a,b,c và các phương thức là hàm tạo mạc định, hàm tạo 3 tham số, hàm bạn nạp chồng toán tử xuất, hàm bạn kiểm tra tam giác.
Và các hàm bạn mình đã minh họa cho các bạn thấy rằng hàm bạn hoàn toàn có thể định nghĩa được ở trong class như các phương thức của lớp và khi định nghĩa ở ngoài class nó hoàn toàn được định nghĩa như các hàm thông thường.
Các bạn nên dùng hàm bạn để nạp chồng toán tử vì:
- Toán tử nạp chồng là hàm bình thường, không phải là hàm thành viên (phương thức) nên chúng truy cập dữ liệu thông qua hàm truy cập và hàm biến đổi nên nó rất kém hiệu quả (do mất phụ phí lời gọi)
- Hàm bạn có thể truy cập trực tiếp dữ liệu từ biến private nên nó không mất phụ phí -> Cải thiện hiệu quả thực hiện, tránh gọi hàm thành viên truy cập || biến đổi.
2. Lớp bạn (Friend Class)
Lớp bạn cũng giống như hàm bạn là nó có thể truy cập các biến thành viên private của lớp kia.
Ta có class A là bạn của class B nên tất cả hàm thành viên của lớp B là bạn của lớp A và chiều ngược lại thì không đúng.
Cú pháp: ta thêm từ khóa friend
trước class
.
Ví dụ:
#include <bits/stdc++.h>
using namespace std;
class B{
private:
int b;
public:
B()
{
b = 10;
}
friend class A;
};
class A{
public:
void print(B arg)
{
cout<<arg.b;
}
};
int main()
{
B b;
A a;
a.print(b);
return 0;
}
Ví dụ trên ta có class A là bạn của class B nên mặc dù b là biến trong phạm vi private nhưng ta vẫn truy cập trực tiếp nó được và kết quả sau khi chạy chương trình ra 10.
Tổng Kết
Qua bài viết trên mình đã trình bày những thứ cơ bản nhất về hàm bạn và lớp bạn mong các bạn đóng góp thêm để mình có thể có thêm nhiều kiến thức mới.
Cảm ơn các bạn đã xem và ủng hộ mình trong các bài viết kế tiếp nhé!!