3: Một hàm có thể là hàm bạn của nhiều lớp được không?

Một phần của tài liệu Lập trinh C cơ bản (Trang 70 - 73)

6. 2: Hàm bạn (friend function)

6.2. 3: Một hàm có thể là hàm bạn của nhiều lớp được không?

Câu trả lời là được, khi một hàm là hàm 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. Để làm cho hàm f trở thành hàm bạn của các lớp A,B,C ta sử dụng mẫu viết 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 {

private :

... // Khai báo các thuộc tính của lớp A public :

//Khai báo f là hàm bạn của lớp A friend void f(...) ;

} ;

Tương tự ta cũng làm như trên đối với các lớp B và C như sau : class B

{

private :

... // Khai báo các thuộc tính của lớp B public :

//Khai báo f là hàm bạn của lớp B friend void f(...) ;

} ; class C {

private :

... // Khai báo các thuộc tính của lớp C public :

//Khai báo f là hàm bạn của lớp C friend void f(...) ;

} ;

//Sau khi khai báo như trên ta đi xây dựng hàm f void f(...)

{ ... }

Chương trình sau đây minh hoạ 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 (vectơ), MT (ma trận) và 3 hàm để thực hiện thao tác trên 2 lớp này

//Hàm bạn với lớp VT dùng để in 1 vectơ friend void in(const VT &x) ;

// Hàm bạn với lớp MT dùng để in 1 ma trận friend void in(const MT &a) ;

// Hàm bạn với cả 2 lớp MT và VT dùng để nhân ma trận với vectơ

Nội dung của chương trình là nhập một ma trận vuông cấp n và một vectơ cấp n, sau đó thực hiện phép nhân ma trận với vectơ vừa nhập

Chương trình : Code: #include<conio.h> #include<iostream.h> #include<math.h> class VT ; class MT ; class VT { private : int n ; double x[20] ; 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 nhap cap cua vecto : « ; cin>>n ;

for(int i=1;i<=n ;i++) {

cout<< »\n phan tu thu « <<i<< » : » ; cin>>x[i] ;

} }

void MT ::nhapsl() {

cout<< »\n nhap cap cua ma tran : « ;cin>>n ; for(int i=1 ;i<=n ;i++)

for(j=1 ;j<=n ;j++) {

cout<< »\n phan tu hang « <<i<< » cot « <<j<< » : » ; cin>>a[i][j] ;

}

VT tich(const MT &a,const VT &x) {

VT y ;

if(n !=x.n) return x ; y.n=n ;

for(int i=1 ;i<=n ;i++) { y.x[i]=0 ; for(int j=1 ;j<=n ;j++) y.x[i]+=a.a[i][j]*x.x[j] ; } return y ; }

void in(const VT &x) {

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 ;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\n Vecto x : « ; in(x) ;

cout<< »\n\n Vecto y=Ax : « ; in(y) ;

getch() ; }

__________________

gogo! hoan hô nào, vỗ tay nào

Nào thì chúng ta cùng hoan hô nào vỗ tay nào

7.1. Các từ khoá private và public

Các thành phần (thuộc tính và phương thức) của lớp có thể khai báo là private hoặc public theo mẫu :

private :

//Khai báo các thành phần riêng của lớp public :

chú ý : các thành phần khai báo mặc định (không dùng các từ khoá private hay public) được xem là thành phần private.

7.2.Các thành phần riêng của lớp.

Chỉ được sử dụng trong phạm vi của lớp (trong thân các phương thức của lớp).Chúng không thể đem ra sử dụng bên ngoài lớp

+) Một thuộc tính private : Thuộc tính này của một đối tượng nào đó chỉ có thể sử dụng trong thân các phương thức cùng lớp.

Để làm rõ hơn khái niệm này ta có thể xét ví dụ sau : Xét một lớp PS(phân số) với 2 thuộc tính nguyên là t(tử) và m(mẫu). Giả sử cần xây dựng các phương thức để thực hiện các phép toán như cộng , trừ, nhân , chia 2 phân số. Do các phép toán này cần dùng trong toàn bộ chương trình, nên các phương thức dùng để thực hiện các phép toán cần được khai báo là public. Để thực hiện các phép toán trên phân số cần dùng đến phép rút gọn phân số. Ta có thể dùng một phương thức private để thực hiện điều này do việc rút gọn chỉ dùng trong nội bộ lớp.

Một phần của tài liệu Lập trinh C cơ bản (Trang 70 - 73)

Tải bản đầy đủ (DOC)

(91 trang)
w