Ch ng 8. Hàm b n, đ nh nghĩa phép toán cho l pươ
CH NG 8ƯƠ
HÀM BN, ĐỊNH NGHĨA PHÉP TOÁN CHO LP
Hàm b n
Đ nh nghĩa phép toán cho l p
I. 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: ế
ch 1:ng t khóa friend đ khai báo hàm trong l p 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(...)
{
...
}
ch 2: Dùng t khóa friend đ 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 th truy nh p t i các thu c tính c a 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 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) 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 ư ượ ượ
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. ươ ườ
t l p SP (s ph c), hãy so 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;
}
};
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;
}
};
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 o l i trong thânươ ượ
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 b n c a nhi u l p, thì nó 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ươ
Đ 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 o 2 l p ươ ư VT (véc t ), ơMT (ma tr n) 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