Tác giả phạm hồng thái bài giảng ngôn ngữ LẬp trình c/C++



tải về 1.98 Mb.
trang49/55
Chuyển đổi dữ liệu07.07.2016
Kích1.98 Mb.
1   ...   45   46   47   48   49   50   51   52   ...   55

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ó 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)



{

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.


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.

Để 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

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 véc tơ

friend VT tich(const MT &a, const VT &x);

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

#include

#include

#include

class VT;

class MT;

class VT

{

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 = ";



cin >> n ;

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

{

cout << "\n Phan tu thu " << i <<" = " ;



cin >> x[i];

}

}


void MT::nhapsl()

{

cout <<"\n Cap ma tran = ";



cin >> n ;

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

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

{

cout << "\n Phan tu thu: "<

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();



}

ĐỊNH NGHĨA PHÉP TOÁN CHO LỚP


Đối với mỗi lớp ta có thể sử dụng lại các kí hiệu phép toán thông dụng (+, -, *, …) để định nghĩa cho các phép toán của lớp. Sau khi được định nghĩa các kí hiệu này sẽ được dùng như các phép toán của lớp theo cách viết thông thường. Cách định nghĩa này được gọi là phép chồng toán tử (như khái niệm chồng hàm trong các chương trước).

1   ...   45   46   47   48   49   50   51   52   ...   55


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2016
được sử dụng cho việc quản lý

    Quê hương