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 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 ñộ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 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

• 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(); }; };

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

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 << “)”; } };