Hàm bạn, lớp bạn
Tuy không phải là phương thức của lớp, nhưng có thể truy nhập đến các thành phần riêng (private) của lớp. Một hàm có thể là bạn của nhiều lớp. Thì tất cả các phương thức của a đều có thể truy nhập đến các thành phần ...
Tuy không phải là phương thức của lớp, nhưng có thể truy nhập đến các thành phần riêng (private) của lớp. Một hàm có thể là bạn của nhiều lớp.
Thì tất cả các phương thức của a đều có thể truy nhập đến các thành phần riêng của lớp b. Một lớp có thể là bạn của nhiều lớp khác. Cũng có thể khai báo a là bạn của b và b là bạn của a.
Giả sử có 3 lớp a, b và c. Để khai báo lớp này là bạn của lớp kia, ta viết theo mẫu sau:
// khai báo trước các lớp Class a; Class b ; Class c; // định nghĩa các lớp Class a { ... Friend class b ; // lớp b là bạn của a Friend class c ; // lớp c là bạn của a ... }; Class b { ... Friend class a ; // lớp a là bạn của b Friend class c ; // lớp c là bạn của b ... }; Class c { ... Friend class b ; // lớp b là bạn của c ... };
Chương trình dưới đây có 2 lớp:
Mt (ma trận vuông)
vt (véc tơ)
Lớp mt là bạn của vt và lớp vt là bạn của mt. Trong chương trình sử dụng các phương thức trùng tên:
2 phương thức nhap():
Nhập ma trận
Nhập véc tơ
2 phương thức in():
In ma trận
In véc tơ
4 phương thức tich():
Tích ma trận với ma trận, kết quả là ma trận
Tích ma trận với véc tơ, kết quả là véc tơ
Tích véc tơ với ma trận, kết quả là véc tơ
Tích véc tơ với véc tơ, kết quả là số thực
Nội dung chương trình là:
+ nhập các ma trận a, b, c
+ nhập các véc tơ
+ tính tích d = ab
+ tính tích u = dy
+ tính tích v = xc
+ tính tích s = vu
//ct4_17.cpp // lop ban // lop mt , lop vt #include <conio.h> #include <iostream.h> Class mt; Class vt; Class mt { Private: Double a[10][10]; Int n; Public: Friend class vt; Mt() { N=0; } Void nhap(); Void in(); Vt tich(const vt &y); Mt tich(const mt &b) ; } ; Class vt { Private: Double x[10]; Int n; Public: Friend class mt; Vt() { N=0; } Void nhap(); Void in(); Vt tich(const mt &b); Double tich(const vt &y) ; } ; Void mt::nhap() { Cout << " cap ma tran: " ; Cin >> n; For (int i=1; i<=n; ++i) For (int j=1; j<=n; ++j) { Cout << " phan tu hang " << i << " cot " << j << " = " ; Cin >> a[i][j]; } } Void mt::in() { For (int i=1; i<=n; ++i) { Cout << " " ; For (int j=1; j<=n; ++j) Cout << a[i][j] << " " ; } } Void vt::nhap() { Cout << " cap vec to: " ; Cin >> n; For (int i=1; i<=n; ++i) { Cout << " phan tu thu " << i << " = " ; Cin >> x[i]; } } Void vt::in() { For (int i=1; i<=n; ++i) Cout << x[i] << " " ; } Vt mt::tich(const vt &y) { Vt z; Int i,j; For (i=1; i<=n; ++i) { Z.x[i] = 0.0 ; For (j=1; j<=n; ++j) Z.x[i] += a[i][j]*y.x[j]; } Z.n = n; Return z; } Mt mt::tich(const mt &b) { Mt c; Int i,j,k; For (i=1; i<=n; ++i) For (j=1; j<=n; ++j) { C.a[i][j] = 0.0 ; For (k=1; k<=n; ++k) C.a[i][j] += a[i][k]*b.a[k][j]; } C.n = n; Return c; } Vt vt::tich(const mt &b) { Vt z; Int i,j; For (j=1; j<=n; ++j) { Z.x[j] = 0.0 ; For (i=1; i<=n; ++i) Z.x[j] += b.a[i][j]*x[i]; } Z.n = n; Return z; } Double vt::tich(const vt &y) { Double tg=0.0; For (int i=1; i<=n; ++i) Tg += x[i]*y.x[i]; Return tg; } Void main() { Mt a,b,c; Vt x,y; Clrscr(); Cout << " ma tran a"; A.nhap(); Cout << " ma tran b"; B.nhap(); Cout << " ma tran c"; C.nhap(); Cout << " vec to x"; X.nhap(); Cout << " vec to y"; Y.nhap(); Mt d= a.tich(b); Vt u = d.tich(y); Vt v = x.tich(c); Double s = v.tich(u); Cout << " vec to v "; V.in(); Cout << " ma tran d"; D.in(); Cout << " vec to y "; Y.in(); Cout << " s= vdy = " << s; Getch(); }