lập trình C++ - Quá tải

Chia sẻ: Quyen Duy | Ngày: | Loại File: PPT | Số trang:27

1
369
lượt xem
152
download

lập trình C++ - Quá tải

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Khi lập trình phải xây dựng các lớp từ đơn giản đến phức tạp. Sau khi cài đặt xong một phương thức cần kiểm tra tính đúng đắn của phương thức đó trước khi thêm các phương thức khác.

Chủ đề:
Lưu

Nội dung Text: lập trình C++ - Quá tải

  1. Lập trình C++ 1 © Giáo viên: Trần Minh Tuấn tmtuan@ifi.edu.vn Tham khảo thêm slide của GV Mai Thuý Nga 1
  2. Bài 3: Quá tải Xây dựng chương trình từng bước 1. Quá tải hàm 2. Quá tải phương thức 3. Quá tải toán tử 4. Review 5. Bài tập 6. 2
  3. Chú ý khi xây dựng chương trình Xây dựng các lớp từ đơn giản đến phức tạp.   Sau khi cài đặt xong một phương thức cần kiểm tra tính đúng đắn của phương thức đó trước khi thêm các phương thức khác.  Bài toán: Xây dựng lớp Phân số  Mộ tphân số gồm tử số và mẫu số.  Có thể rút gọn phân số, cộng 2 phân số... 3
  4. Lớp Phân số cơ bản  Xây dựng lớp Phân số cơ bản:  class Phanso  {  private:  int tuso; // tử số  int mauso; // mẫu số  public:  void DatTS(int ts); // đặt giá trị cho tử số  void DatMS(int ms); // đặt giá trị cho mẫu số  // lấy giá trị tử số int LayTS();  // lấy giá trị mẫu số int LayMS();  // in phân số dưới dạng a/b void InPS();  };  4
  5. Lớp Phân số cơ bản  Sau khi cài đặt xong lớp Phanso, kiểm tra lớp  này: void main()  {  Phanso x;  x.DatTS(3);  x.DatMS(5);  cout
  6. Thêm cấu tử Thêm các cấu tử:  // cấu tử mặc định, đặt phân số 1/1 Phanso();  Phanso(int a); // đặt phân số a/1  Phanso(int a, int b); // đặt phân số a/b  Phanso(Phanso &ps); // cấu tử sao chép  Kiểm tra:  void main()  {  Phanso x, y(5), z(2,7), k(y);  ...  }  6
  7. Thêm phương thức Rút gọn Ta cần xây dựng hàm tìm ước số chung lớn nhất.  Nên để hàm này là public hay private ?  Xây dựng phương thức Rút gọn phân số sử dụng hàm tìm USCLN ở trên class Phanso  {  private:  …  int USCLN();  public:  ...  Phanso Rutgon();  7 }; 
  8. Thêm phương thức Rút gọn Kiểm tra:  void main()  {  Phanso x(6,3), y(5,8), z;  x.InPS(); z = x.Rutgon(); z.InPS();  y.InPS(); z = y.Rutgon(); z.InPS();  }  8
  9. Thêm phương thức Cộng Xây dựng phương thức cộng 2 phân số  class Phanso  {  public:  ...  Phanso Cong(Phanso ps);  };  Kiểm tra:  Phanso x(3,6), y(2,5), z;  z = x.Cong(y);  z = z.Rutgon();  cout
  10. Vấn đề với lớp Phanso Lớp Phanso đã xây dựng là tương đối hoàn  chỉnh, tuy nhiên nó có hạn chế sau:  Phương thức Cong không được “tự nhiên”. Sẽ thuận tiện hơn nếu ta có thể viết z = x + y. Giải pháp: Sử dụng quá tải !  10
  11. Quá tải (Overloading) Quá tải trong C++ có 2 dạng:  nhiều hàm có cùng một tên nhưng có đối số  Dùng khác nhau (quá tải hàm)  Dùng các cài đặt của riêng lớp cho các toán tử, ví dụ như +, -, ++… (quá tải toán tử) Hai khả năng của quá tải đều rất mạnh, nhưng  để sử dụng chúng một cách hiệu quả đòi hỏi người lập trình phải thận trọng. 11
  12. Quá tải hàm Ngôn ngữ C bắt buộc mỗi hàm phải có một tên  riêng biệt. Nhiều hàm có cùng ý nghĩa nhưng phải đặt tên khác nhau.  Ví dụ: Trong C có 3 hàm tính giá trị tuyệt đối  intabs(int i);  long labs(long l);  double fabs(double d); => Rắc rối khi sử dụng ! 12
  13. Quá tải hàm C++ cho phép tạo ra các hàm có tên trùng nhau  nhưng khác nhau ở các đối số. Điều này gọi là quá tải hàm (function overloading).  Ví dụ:  int abs(int i);  long abs(long i);  double abs(double d);  int Tong(int a, int b);  int Tong(int a, int b, int c);  long Tong(long a, long b); 13
  14. Chú ý với quá tải hàm Không thể viết quá tải hàm có giá trị trả về khác nhau  và các đối số giống nhau. Ví dụ khai báo sau sẽ bị thông báo lỗi khi biên dịch: int Tong(int a, int b);  long Tong(int a, int b);  Cần đảm bảo kiểu của các đối số là khác nhau thực sự.  Kiểu định nghĩa bởi typedef chỉ là một bí danh của một kiểu đã có, vì vậy đoạn chương trình sau sẽ bị lỗi: typedef int Songuyen;  int Tang(int a);  int Tang(Songuyen a);  ...  14
  15. Quá tải phương thức Tương tự như hàm, các phương thức của lớp  cũng có thể được quá tải.  Ví dụ: Lớp Phanso có 2 phương thức cộng Cộng một phân số với một phân số  //  Phanso Cong(Phanso ps);  // Cộng một phân số với một số nguyên  Phanso Cong(int n); Đặc biệt, nên quá tải các cấu tử của lớp để cung  cấp nhiều cách khởi tạo đa dạng. 15
  16. Quá tải toán tử Với mỗi kiểu dữ liệu được xây dựng sẵn như int,  float, char…, ta có các toán tử thao tác trên đó như ++, +, -…  Với các lớp, ta vẫn thường xây dựng phương thức để thực hiện các thao tác trên đó. Ví dụ:  Lớp Phanso có phương thức Cong  Để cộng 2 phân số, ta dùng: z = x.Cong(y); // cách viết này không “tự nhiên” ! 16
  17. Quá tải toán tử C++ cho phép xây dựng các lớp trong đó có thể định  nghĩa lại thao tác của các toán tử. Điều này gọi là quá tải toán tử (operator overloading). Các toán tử có thể quá tải là:  ++, --, +, -, *, /, +=, -=, *=, /=, ,
  18. Quá tải toán tử + cho lớp Phanso Ta sẽ quá tải toán tử + trong lớp Phanso để thay  cho phương thức Cong class Phanso  {  public:  ...  Phanso operator+(Phanso ps);  };  Phanso operator+(Phanso ps)  {  int kqts = ts*ps.ms + ps.ts*ms;  int kqms = ms*ps.ms;  return Phanso(kqts, kqms); // trả về đối tượng không tên  }  18
  19. Quá tải toán tử + cho lớp Phanso Kiểm tra 1:  void main()  {  Phanso x(4,5), y(3,8), z;  z = x + y;  z.InPS();  }  Kiểm tra 2:  void main()  {  Phanso x(4,5), z;  z = x + 2; // câu lệnh này báo lỗi !  z.InPS();  }  19
  20. Quá tải toán tử + cho lớp Phanso Để có thể cộng một phân số với một số nguyên, ta tiếp  tục quá tải toán tử + với đối số kiểu int: class Phanso  {  public:  ...  Phanso operator+(int n);  };  Kiểm tra 2:  void main()  {  Phanso x(4,5), z;  z = x + 2; // bây giờ câu lệnh này là hợp lệ  z.InPS();  }  20
Đồng bộ tài khoản