
Ch ng 8. Hàm b n, đ nh nghĩa phép toán cho l pươ ạ ị ớ
CH NG 8ƯƠ
HÀM BẠN, ĐỊNH NGHĨA PHÉP TOÁN CHO LỚP
Hàm b nạ
Đ nh nghĩa phép toán cho l pị ớ
I. HÀM B N Ạ(FRIEND FUNCTION)
1. Hàm b n ạ
Đ m t hàm tr thành b n c a m t l p, có 2 cách vi t:ể ộ ở ạ ủ ộ ớ ế
Cách 1: Dùng t khóa friend đ khai báo hàm trong l p và xây d ng hàm bênừ ể ớ ự
ngoài nh các hàm thông th ng (không dùng t khóa friend). M u vi t nh sau:ư ườ ừ ẫ ế ư
class A
{
private:
// Khai báo các thu c tínhộ
public:
...
// Khai báo các hàm b n c a l p Aạ ủ ớ
friend void f1(...);
friend double f2(...);
friend A f3(...) ;
...
} ;
// Xây d ng các hàm f1, f2, f3ự
void f1(...)
{
...
}
double f2(...)
{
242

Ch ng 8. Hàm b n, đ nh nghĩa phép toán cho l pươ ạ ị ớ
...
}
A f3(...)
{
...
}
Cách 2: Dùng t khóa friend đ xây d ng hàm trong đ nh nghĩa l p. M u vi từ ể ự ị ớ ẫ ế
nh sau:ư
class A
{
private:
// Khai báo các thu c tínhộ
public:
// Xây d ng các hàm b n c a l p Aự ạ ủ ớ
void f1(...)
{
...
}
double f2(...)
{
...
}
A f3(...)
{
...
}
...
} ;
2. Tính ch t c a hàm b nấ ủ ạ
Trong thân hàm b n c a m t l p có th truy nh p t i các thu c tính c a cácạ ủ ộ ớ ể ậ ớ ộ ủ
đ i t ng thu c l p này. Đây là s khác nhau duy nh t gi a hàm b n và hàm thôngố ượ ộ ớ ự ấ ữ ạ
th ng. ườ
Chú ý r ng hàm b n không ph i là ph ng th c c a l p. Ph ng th c cóằ ạ ả ươ ứ ủ ớ ươ ứ
243

Ch ng 8. Hàm b n, đ nh nghĩa phép toán cho l pươ ạ ị ớ
m t đ i n ( ng v i con tr this) và l i g i c a ph ng th c ph i g n v i m tộ ố ẩ ứ ớ ỏ ờ ọ ủ ươ ứ ả ắ ớ ộ
đ i t ng nào đó (đ a ch đ i t ng này đ c truy n cho con tr this). L i g i c aố ượ ị ỉ ố ượ ượ ề ỏ ờ ọ ủ
hàm b n gi ng nh l i g i c a hàm thông th ng.ạ ố ư ờ ọ ủ ườ
Ví d sau s so sánh ph ng th c, hàm b n và hàm thông th ng.ụ ẽ ươ ứ ạ ườ
Xét l p ớSP (s ph c), hãy so sánh 3 ph ng án đ th c hi n vi c c ng 2 số ứ ươ ể ự ệ ệ ộ ố
ph c:ứ
Ph ng án 1ươ : Dùng ph ng th cươ ứ
class SP
{
private:
double a; // ph n th cầ ự
double b; // Ph n oầ ả
public:
SP cong(SP u2)
{
SP u:
u.a = this → a + u2.a ;
u.b = this → b + u2.b ;
return u;
}
};
Cách dùng:
SP u, u1, u2;
u = u1.cong(u2);
Ph ng án ươ 2: Dùng hàm b nạ
class SP
{
private:
double a; // Ph n th cầ ự
double b; // Ph n oầ ả
public:
friend SP cong(SP u1 , SP u2)
244

Ch ng 8. Hàm b n, đ nh nghĩa phép toán cho l pươ ạ ị ớ
{
SP u:
u.a = u1.a + u2.a ;
u.b = u1.b + u2.b ;
return u;
}
};
Cách dùng
SP u, u1, u2;
u = cong(u1, u2);
Ph ng án 3ươ : Dùng hàm thông th ngườ
class SP
{
private:
double a; // ph n th cầ ự
double b; // Ph n oầ ả
public:
...
};
SP cong(SP u1, SP u2)
{
SP u:
u.a = u1.a + u2.a ;
u.b = u1.b + u2.b ;
return u;
}
Ph ng án này không đ c ch p nh n, trình biên d ch s báo l i trong thânươ ượ ấ ậ ị ẽ ỗ
hàm không đ c quy n truy xu t đ n các thu c tính riêng (private) a, b c a các đ iượ ề ấ ế ộ ủ ố
t ng u, u1 và u2 thu c l p SP.ượ ộ ớ
3. Hàm b n c a nhi u l p ạ ủ ề ớ
Khi m t hàm là b n c a nhi u l p, thì nó có quy n truy nh p t i t t c cácộ ạ ủ ề ớ ề ậ ớ ấ ả
thu c tính c a các đ i t ng trong các l p này. ộ ủ ố ượ ớ
245

Ch ng 8. Hàm b n, đ nh nghĩa phép toán cho l pươ ạ ị ớ
Đ làm cho hàm f tr thành b n c a các l p A, ể ở ạ ủ ớ B và C ta s d ng m u vi t nhử ụ ẫ ế ư
sau:
class A; // Khai báo tr c l p Aướ ớ
class B; // Khai báo tr c l p Bướ ớ
class C; // Khai báo tr c l p Cướ ớ
// Đ nh nghĩa l p Aị ớ
class A
{
// Khai báo f là b n c a Aạ ủ
friend void f(...) ;
} ;
// Đ nh nghĩa l p Bị ớ
class B
{
// Khai báo f là b n c a Bạ ủ
friend void f(...) ;
} ;
// Đ nhị nghĩa l p Cớ
class C
{
// Khai báo f là b n c a Cạ ủ
friend void f(...) ;
} ;
// Xây d ng hàm fụ
void f(...)
{
...
}
Ch ng trình sau đây minh h a cách dùng hàm b n (b n c a m t l p và b nươ ọ ạ ạ ủ ộ ớ ạ
c a nhi u l p). Ch ng trình đ a vào 2 l p ủ ề ớ ươ ư ớ VT (véc t ), ơMT (ma tr n) và 3 hàmậ
b n đ th c hi n các thao tác trên 2 l p này:ạ ể ự ệ ớ
// Hàm b n v i l p ạ ớ ớ VT dùng đ in m t véc t ể ộ ơ
friend void in(const VT &x);
// Hàm b n v i l p ạ ớ ớ MT dùng đ in m t ma tr nể ộ ậ
246