void InHoanhDoTam{ cout... friend class DuongTron; }: int bankinh; public : ...
Trang 1HÀM B Ạ N
HÀM B Ạ N – – L L Ớ Ớ P B P B Ạ Ạ N N
Ch ươ ng 6
1
Nội dung Nội dung
• Gi ớ i thi ệ u
• Hàm ñộ c l ậ p là hàm b ạ n
• Hàm thành viên là hàm b ạ n
• Hàm b ạ n c ủ a nhi ề u l ớ p
• Hàm b ạ n c ủ a nhi ề u l ớ p
• L ớ p b ạ n
2
Giới thiệu
Giới thiệu
• T ạ i sao c ầ n hàm b ạ n?
class Diem {
int x, y;
public :
….
int GiaTriX()
{ return x; }
Muốn truy cập các thành phầ
private hay protected của 1 lớp
từbên ngoài của lớp
phải thiết kếcác hàm
l ấ y giá tr ị d ữ li u thành viên
};
class DuongTron {
int bankinh;
public:
…
void InHoanhDoTam(){
cout<<tam.GiaTriX();}
};
Khai báo trong l ớ p Diem hàm sau:
friend voidDuongTron::InHoanhDoTam();
l ấ y giá tr ị d ữ li u thành viên
Nếu sốlượng các thành phầ
dữliệu trong lớp quá nhiề
thiết kếhàm b ạ n (friend)
• Khái ni ệ m hàm b ạ n
– Hàm b ạ n c ủ a 1 l ớ p là hàm có kh ả n ă ng truy c ậ p ñế n các thành ph ầ n dùng riêng (d ữ li ệ u và hàm) c ủ a l ớ p
ñ ó.
– Cú pháp: khai báo prototype c a hàm trong l ớ p
mu ố n cho phép truy c ậ p ñ ó v ớ i t ừ khóa friend.
Giới Giới thiệu thiệu
class A {
public :
…
Friend void HamDocLap(A);
Friend int B::HamThanhVien();
};
void HamDocLap(A x) { cout<<x.a1; }
class B {
…
int HamThanhVien(); };
int B::HamThanhVien() {
A y; … return y.a1;
}
Trang 2Hàm ñộc lập là hàm bạn
Hàm ñộc lập là hàm bạn
• Hàm ñộ c l ậ p (không thu ộ c l ớ p nào) có th ể ñượ c khai
báo là b ạ n c ủ a 1 l ớ p.
• Ch ỉ c ầ n khai báo tên hàm ñộ c l ậ p bên trong l ớ p.
• Trong n ộ i dung hàm ñộ c l ậ p, có th ể truy c ậ p b ấ t k ỳ thành
ph ầ n nào thu ộ c l ớ p ñ ó.
class Diem {
5
public :
…
friend int Trung( Diem , Diem );
};
int Trung(Diem a, Diem b){
if (a.x==b.x && a.y==b.y) return 1;
else
return 0;
}
Hàm ñộc lập là hàm bạn Hàm ñộc lập là hàm bạn
class PhanSo {
int tu, mau;
public :
…
friend int SoSanhBang ( PhanSo , PhanSo );
};
6
};
int SoSanhBang( PhanSo a, PhanSo b){
if (a.tu*b.mau== b.tu*a.mau) return 1;
else
return 0;
}
Hàm thành viên là hàm bạn
Hàm thành viên là hàm bạn
• Hàm thành viên c ủ a 1 l ớ p có th ể ñượ c khai báo là b ạ n
c ủ a 1 l ớ p khác.
• Ch ỉ c ầ n khai báo <Tên lớp>::<Tên hàm thành viên>
bên trong l ớ p c ầ n truy c ậ p.
• Trong n ộ i dung hàm thành viên, có th ể truy c ậ p b ấ t k ỳ
thành ph ầ n nào thu ộ c l ớ p ñ ã khai báo.
class DoanThang {
class DoanThang ;
class Diem {
public :
…
friend float
DoanThang ::ChieuDai();
};
class DoanThang {
Diem d1, d2;
public :
…
sqrt(
pow((d1.x - d2.x),2) +
pow((d1.y - d2.y),2));
} };
Hàm bạn của nhiều lớp Hàm bạn của nhiều lớp
Hàm b ạ n ñ ã phá v ỡ tính bao gói c ủ a OOP => không l ạ m d ụ ng.
• M ộ t l ớ p có th ể có nhi ề u hàm b ạ n ( ñộ c l ậ p hay hàm thành viên c ủ a l ớ p khác).
• M ộ t hàm ( ñộ c l ậ p hay hàm thành viên) có th ể là b ạ n c ủ a nhi ề u l ớ p.
class B
class A {
…
friend void B::F();
friend int F1(A, B);
… };
class B {
…
friend int F1(A , B);
… };
void B ::F(){ … }
int F1( A x, B y) { … }
L ớ p có 2 hàm b ạ n
Hàm F1(…) là b ạ n
c ủ a 2 l ớ p A và B
Trang 3Lớp bạn (friend class)
Lớp bạn (friend class)
Khi mu ố n khai báo t ấ t c ả
các hàm thành viên c ủ a
l ớ p A là b ạ n c ủ a l ớ p B
Khai báo A là
lớp bạn c ủ a
l ớ p B
class DuongTron ;
class Diem {
class DuongTron {
Diem tam;
int bankinh;
9
public :
friend class
DuongTron;
}:
int bankinh;
public :
DuongTron ( int x1, int y1, int bk) {tam.x = a; tam.y = y1; bankinh = bk;
}
void Ve() { cout << “(“ << tam.x << “,”
<< tam.y <<“,”
<< bankinh << “)”;
} };