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