Hàm friend (hàm bạn)

Một phần của tài liệu Giáo trình Lập trình hướng đối tượng (Nghề Lập trình máy tính): Phần 1 - Tổng cục dạy nghề (Trang 31 - 37)

Trong thực tế thường xãy ra trường hợp có một số lớp cần sử dụng chung một hàm. C++ giải quyết vấn đề này bằng cách dùng 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 (...) ; ...

} ;

{ ... } double f2 (...) { ... }

Cách 2: Dùng từ khóa friend để xâ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 :

...

// Khai báo các hàm bạn của lớp A void f1 (...) { ... } double f2 (...) { ... } } ; Hàm bạn có những tính chất sau:

- Hàm bạn khơng phải là hàm thành phần của lớp.

- Việc truy nhập tới hàm bạn được thực hiện như hàm thông thường.

- 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 đố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. - Một hàm có thể là bạn của nhiều lớp. Lúc đó 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 sau :

class B ; //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 {

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(...) { ... }; Ví dụ 2.11 #include <iostream.h> #include <conio.h> class sophuc {float a,b; public : sophuc() {} sophuc(float x, float y) {a=x; b=y;}

friend sophuc tong(sophuc,sophuc); friend void hienthi(sophuc);

};

sophuc tong(sophuc c1,sophuc c2) {sophuc c3; c3.a=c1.a + c2.a ; c3.b=c1.b + c2.b ; return (c3); } void hienthi(sophuc c) {cout<<c.a<<" + "<<c.b<<"i"<<endl; } void main() { clrscr();

sophuc d1 (2.1,3.4); sophuc d2 (1.2,2.3) ; sophuc d3 ; d3 = tong(d1,d2); cout<<"d1= ";hienthi(d1); cout<<"d2= ";hienthi(d2); cout<<"d3= ";hienthi(d3); getch(); }

Chương trình cho kết quả như sau: d1= 2.1 + 3.4i d2= 1.2 + 2.3i d3= 3.3 + 5.7i Ví dụ 2.12 #include <iostream.h> #include <conio.h> class LOP1; class LOP2 { int v2; public: void nhap(int a) { v2=a;} void hienthi(void) { cout<<v2<<"\n";}

friend void traodoi(LOP1 &, LOP2 &); }; class LOP1 { int v1; public: void nhap(int a) { v1=a;} void hienthi(void) { cout<<v1<<"\n";}

friend void traodoi(LOP1 &, LOP2 &); };

void traodoi(LOP1 &x, LOP2 &y) {

x.v1 = y.v2; y.v2 = t; } void main() { clrscr(); LOP1 ob1; LOP2 ob2; ob1.nhap(150); ob2.nhap(200);

cout << "Gia tri ban dau :" << "\n"; ob1.hienthi();

ob2.hienthi();

traodoi(ob1, ob2); //Thuc hien hoan doi cout << "Gia tri sau khi thay doi:" << "\n"; ob1.hienthi();

ob2.hienthi(); getch(); }

Chương trình cho kết quả như sau: Gia tri ban dau :

150 200

Gia tri sau khi thay doi: 200

150

Bài tập:

1. Xây dựng lớp thời gian Time. Dữ liệu thành phần bao gồm giờ, phút giây. Các hàm thành phần bao gồm: hàm tạo, hàm truy cập dữ liệu, hàm normalize() để chuẩn hóa dữ liệu nằm trong khong quy định của giờ (0 ? giờ < 24) , phút (0 ? phút <60), giây (0 ? giây <60), hàm advance(int h, int m, int s) để tăng thời gian hiện hành của đối tượng đang tồn tại, hàm reset(int h, int m, int s) để chỉnh lại thời gian hiện hành của một đối tượng đang tồn tại và một hàm print() để hiển thị dữ liệu.

2. Xây dựng lớp Date. Dữ liệu thành phần bao gồm ngày, tháng, năm. Các hàm thành phần bao gồm: hàm tạo, hàm truy cập dữ liệu, hàm normalize() để chuẩn hóa dữ liệu nằm trong khoảng quy định của ngày (1 ? ngày <daysIn(tháng)), tháng (1 ? tháng < 12), năm (năm ? 1), hàm daysIn(int) tr về số ngày trong tháng, hàm advance(int y, int m, int d) để tăng ngày hiện lên các năm y, tháng m, ngày d của đối tượng đang tồn tại, hàm reset(int y, int m, int d) để đặt lại ngày cho một

3. Thực hiện một lớp String. Mỗi đối tượng của lớp sẽ đại diện một chuỗi ký tự. Những thành phần dữ liệu là chiều dài chuỗi, và chuỗi ký tự. Các hàm thành phần bao gồm: hàm tạo, hàm truy cập, hàm hiển thị, hàm character(int i)tr về một ký tự trong chuỗi được chỉ định bằng tham số i.

4. Xây dựng lớp ma trận có tên là Matrix cho các ma trận, các hàm thành phần bao gồm: hàm tạo mặc định, hàm nhập xuất ma trận, cộng, trừ, nhân hai ma trận. 5. Xây dựng lớp ma trận có tên là Matrix cho các ma trận vuông, các hàm thành

phần bao gồm: hàm tạo mặc định, hàm nhập xuất ma trận, tính định thức và tính ma trận nghịch đảo.

6. Xây dựng lớp Stack cho ngăn xếp kiểu int. Các hàm thành phần bao gồm: Hàm tạo mặc định, hàm hủy, hàm isEmpty() kiểm tra stack có rỗng khơng, hàm isFull() kiểm tra stack có đầy khơng, hàm push() , pop(), hàm in nội dung ngăn xếp. Sử dụng một mảng để thực hiện.

7. Xây dựng lớp hàng đợi Queue chứa phần tử kiểu int. Các hàm thành phần bao gồm: hàm tạo, hàm hủy và những toán tử hàng đợi thông thường: hàm insert() để thêm phần tử vào hàng đợi, hàm remove() để loại bỏ phần tử, hàm isEmpty() kiểm tra hàng đợi có rỗng khơng, hàm isFull() kiểm tra hàng đợi có đầy khơng. Sử dụng một mảng để thực hiện.

4. Xây dựng lớp đa thức và các phương thức cộng, trừ hai đa thức.

8. Xây dựng lớp Sinhvien để quản lý họ tên sinh viên, năm sinh, điểm thi 9 môn học của các sinh viên. Cho biết sinh viên nào được làm khóa luận tốt nghiệp, bao nhiêu sinh viên thi tốt nghiệp, bao nhiêu sinh viên thi lại, tên môn thi lại. Tiêu chuẩn để xét như sau:

- Sinh viên làm khóa luận phải có điểm trung bình từ 7 trở lên, trong đó khơng có mơn nào dưới 5.

- Sinh viên thi tốt nghiệp khi điểm trung bình nhỏ hơn 7 và điểm các mơn khơng dưới 5.

- Sinh viên thi lại môn dưới 5.

9. Xây dựng lớp vector để lưu trữ các vectơ gồm các số thực. Các thành phần dữ liệu bao gồm:

- Kích thước vectơ.

- Một mảng động chứa các thành phần của vectơ.

Các hàm thành phần bao gồm hàm tạo, hàm hủy, hàm tính tích vơ hướng hai vectơ, tính chuẩn của vectơ (theo chuẩn bất kỳ nào đó).

10. Xây dựng lớp Phanso với dữ liệu thành phần là tử và mẫu số. Các hàm thành phần bao gồm:

- Cộng hai phân số, kết quả phải được tối giản - Trừ hai phân số, kết quả phải được tối giản - Nhân hai phân số, kết quả phải được tối giản - Chia hai phân số, kết quả phải được tối giản

Một phần của tài liệu Giáo trình Lập trình hướng đối tượng (Nghề Lập trình máy tính): Phần 1 - Tổng cục dạy nghề (Trang 31 - 37)

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

(68 trang)