Giáo trình ngôn ngữ lập trình C++ - Chương 8 pot - Pdf 18

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

đố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ó một
243
Chương 8. Hàm bạn, định nghĩa phép toán cho lớp
đố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

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

private:
int n;
double x[20]; // Toa do cua diem
public:
void nhapsl();
friend void in(const VT &x);
friend VT tich(const MT &a, const VT &x) ;
};
class MT
{
private:
int n;
double a[20][20];
public:
friend VT tich(const MT &a, const VT &x);
friend void in(const MT &a);
void nhapsl();
} ;
void VT::nhapsl()
{
cout << "\n Cap vec to = ";
247
Chương 8. Hàm bạn, định nghĩa phép toán cho lớp
cin >> n ;
for (int i = 1; i< = n ; ++i)
{
cout << "\n Phan tu thu " << i <<" = " ;
cin >> x[i];
}
}

cout << "\n";
for (int i = 1; i< = x.n; ++i)
cout << x.x[i] << " ";
}
void in(const MT &a)
{
for (int i = 1; i< = a.n; ++i)
{
cout << "\n " ;
for (int j = 1; j< = a.n; ++j)
cout << a.a[i][j] << " ";
}
}
void main()
{
MT a; VT x, y;
clrscr();
a.nhapsl();
x.nhapsl();
y = tich(a, x);
clrscr();
cout << "\n Ma tran A:";
in(a);
cout << "\n Vec to x: " ;
in(x);
cout << "\n Vec to y = Ax: " ;
in(y);
getch();
}
249

struct MT
{
double a[20][20] ; // Mảng chứa các phần tử ma trận
int m ; // Số hàng ma trận
250
Chương 8. Hàm bạn, định nghĩa phép toán cho lớp
int n ; // Số cột ma trận
};
MT operator-(MT x) ;
3. Thân của hàm toán tử
Viết như thân của hàm thông thường. Ví dụ hàm đổi dấu ma trận có thể được
định nghĩa như sau:
struct MT
{
double a[20][20] ; // Mảng chứa các phần tử ma trận
int m ; // Số hàng ma trận
int n ; // Số cột ma trận
};
MT operator-(MT x)
{
MT y;
for (int i=1 ;i<= y.m ; ++i)
for (int j =1 ;j<= y.n ; ++j)y.a[i][j] =- x.a[i][j];
return y;
}
1. Cách dùng hàm toán tử
Có 2 cách dùng:
Cách 1: Dùng như một hàm thông thường bằng cách viết lời gọi
Ví dụ:
PS p, q, u, v ;

{
int a,b;
} PS;
ostream& operator<< (ostream& os, PS p);
istream& operator>> (istream& is,PS &p);
int uscln(int x, int y);
PS rutgon(PS p);
PS operator+(PS p1, PS p2);
PS operator-(PS p1, PS p2);
PS operator*(PS p1, PS p2);
PS operator/(PS p1, PS p2);
ostream& operator<< (ostream& os, PS p)
{
os << p.a << '/' << p.b ;
252
Chương 8. Hàm bạn, định nghĩa phép toán cho lớp
return os;
}
istream& operator>> (istream& is,PS &p)
{
cout << "\n Nhap tu va mau: '' ;
is >> p.a >> p.b ;
return is;
}
int uscln(int x, int y)
{
x=abs(x);y=abs(y);
if (x*y==0) return 1;
while (x!=y)
{

PS operator*(PS p1, PS p2)
{
PS q;
q.a = p1.a * p2.a ;
q.b = p1.b * p2.b ;
return rutgon(q);
}
PS operator/(PS p1 , PS p2)
{
PS q;
q.a = p1.a * p2.b ;
q.b = p1.b * p2.a ;
return rutgon(q);
}
void main()
{
PS p, q, z, u, v ;
PS s;
cout <<"\nNhap cac PS p, q, z, u, v: '' ;
cin >> p >> q >> z >> u >> v ;
s = (p - q*z) / (u + v) ;
cout << "\n Phan so s = " << s;
getch();
}
254
Chương 8. Hàm bạn, định nghĩa phép toán cho lớp
Ví dụ 2 : Chương trình đưa vào các hàm toán tử:
operator- có một đối dùng để đảo dấu một đa thức
operator+ có 2 đối dùng để cộng 2 đa thức
operator- có 2 đối dùng để trừ 2 đa thức

istream& operator>> (istream& is, DT &d)
{
cout << " Bac da thuc: '' ;
cin >> d.n;
cout << ''Nhap cac he so da thuc:" ;
for (int i=0 ;i<=d.n ;++i)
{
cout << "\n He so bac " << i <<" = '' ;
is >> d.a[i] ;
}
return is;
}
DT operator-(const DT& d)
{
DT p;
p.n = d.n;
for (int i=0 ;i<=d.n ;++i)
p.a[i] = -d.a[i];
return p;
}
DT operator+(DT d1, DT d2)
{
DT d;
int k,i;
k = d1.n > d2.n ? d1.n : d2.n ;
for (i=0;i<=k ;++i)
if (i<=d1.n && i<=d2.n) d.a[i] = d1.a[i] + d2.a[i];
else if (i<=d1.n) d.a[i] = d1.a[i];
else d.a[i] = d2.a[i];
i = k;

}
void main()
{
DT p,q,r,s,f;
double x,g;
clrscr();
257
Chương 8. Hàm bạn, định nghĩa phép toán cho lớp
cout <<"\n Nhap da thuc P '' ;cin >> p;
cout <<"\n Nhap da thuc Q '' ;cin >> q;
cout <<"\n Nhap da thuc R '' ;cin >> r;
cout <<"\n Nhap da thuc S '' ;cin >> s;
cout << "\n Nhap so thuc x: '' ;cin >> x;
f = -(p+q)*(r-s);
g = f^x;
cout << "\n Da thuc f "<< f ;
cout << "\n x = '' << x;
cout << "\n f(x) = '' << g;
getch();
}
258


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status