Bài giảng Lập trình hướng đối tượng C++ - Chương 6: Hàm bạn và lớp bạn cung cấp cho người học những kiến thức như: 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; Lớp bạn. Mời các bạn cùng tham khảo!
Trang 1HÀM BẠN – LỚP BẠN
Chương 6
1
Trang 2Nộ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
• Lớp bạn
Trang 3Giới thiệu
• Tại sao cần hàm bạn?
3
class Diem {
int x, y;
public :
….
int GiaTriX()
{ return x; } };
class DuongTron {
Diem tam;
int bankinh;
public:
….
void InHoanhDoTam(){
cout<<tam.GiaTriX();}
};
Khai báo trong lớp Diem hàm sau:
friend void
DuongTron::InHoanhDoTam();
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
phải thiết kế các hàm lấy giá trị dữ liệu thành
viên
Nếu số lượng các thành phần
dữ liệu trong lớp quá nhiều thiết kế hàm bạn (friend)
Trang 4• 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
class A {
int a1;
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;
Giới thiệu
Trang 5Hà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 đó
5
class Diem {
int x,y;
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;
}
Trang 6Hàm độc lập là hàm bạn
class PhanSo {
int tu, mau;
public :
…
friend int SoSanhBang (PhanSo,PhanSo);
};
int SoSanhBang(PhanSo a, PhanSo b){
if (a.tu*b.mau== b.tu*a.mau) return 1;
else
return 0;
}
Trang 7Hà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
7
class DoanThang;
class Diem {
int x,y;
public :
…
friend float
DoanThang::ChieuDai();
};
class DoanThang {
Diem d1, d2;
public :
…
float ChieuDai() { sqrt(
pow((d1.x - d2.x),2) +
pow((d1.y - d2.y),2)); }
};
Trang 8Hà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
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
• 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
Trang 9Lớp bạn (friend class)
9
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 {
int x,y;
public :
friend class
DuongTron;
}:
class DuongTron {
Diem tam;
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 << “)”;
} };