Lập Trình C++ B8: Phép Toán Cho Lớp
Phép toán cho lớp trong c++,
quá tải toán tử c++,
overloading c++
đều là các tên gọi khác nhau của một kỹ thuật chung
– Là một kỹ thuật quan trọng cần thiết trong lập trình hướng đối tượng.
– Nếu đối tượng của bạn cũng có các tính chất của các phép toán như: +,-,*,/, trị tuyệt đối, khai căn…..
– Thì kỹ thuật định nghĩa phép toán cho lớp này rất hữu dụng và cần thiết.
Dẫn dắt vấn đề cho sự ra đời của phép toán cho lớp:
Thông thường, chúng ta chỉ có thể sử dụng được các phép toán:
cộng, trừ, nhân, chia, gán. cho các kiểu dữ liệu truyền thống như số nguyên, số thực….
Giả sử khi tôi muốn định nghĩa ra một lớp đối tượng,
mà đối tượng đó có thể sử dụng được các phép toán như ở trên thì sao.
Ví dụ, tôi có một lớp là đối tượng cho một vector hình học trong không gian đồ họa 3d.
Vậy thì rõ ràng, theo kiến thức về vector, chúng ta có thể có các phép toán cho vector như cộng 2 vector, nhân 2 vector….
Vậy thì làm thế nào chúng ta thực hiện được điều đó.
Bạn không thể khai báo lớp vector1, lớp vector2 rồi sau đó cho chúng cộng lại với nhau và nghĩ rằng,
hệ thống cho phép điều đó.
Không hệ thống chỉ cho phép với các kiểu dữ liệu nguyên thủy.
Và do đó để thực hiện kỹ thuật trên chúng ta phải định nghĩa các phép toán cho lớp.
Chúng ta hãy cùng đi tuần tự các bước từ dễ đến khó.
1. Xây dựng một lớp đối tượng là một vector3d.
Trong hình minh họa trên tôi đã khởi tạo ra một lớp Vector3d.
+ Một vector bao gồm 3 thông số tọa độ thực là x, y, z
+ Các hàm khởi tạo, hàm hủy, hàm set dữ liệu và lấy dữ liệu.
Tiếp theo dưới đây là định nghĩa class nằm trong file cpp
Thông thường, khi khai báo những lớp đối tượng như thế này, người ta sẽ tạo ra những file header riêng và những file cpp riêng. Không nằm cùng với file main.
=> Về cơ bản hết bước 1, tôi đã có một lớp vector3d.
2. Định nghĩa các phép toán cho lớp.
Hãy lưu ý rằng. Chúng ta phải tự mình xác định bài toán rằng.
+ Mình định nghĩa ra một lớp đối tượng là cái gì.
+ Đối tượng đó có tính chất sử dụng được các phép toán học hay không, và đó là phép toán gì.
Chứ không phải bạn định nghĩa ra một lớp bất kỳ rồi bạn nghi rằng, lớp nào cũng có thể sử dụng được các phép toán.
Ví dụ: Bạn định nghĩa một lớp là một học sinh. Sau đó bạn định nghĩa phép cộng cho hai học sinh, thì rất khó để hiểu và thực hành.
Ok. Vẫn với lớp vector ở trên. Tôi sẽ định nghĩa các phép toán. +, -.
Rất đơn giản với cú pháp: Kiểu trả lại operator tên phép toán ( đối số)
Đến đây bạn có thể hiểu rằng, nếu không định nghĩa phép toán.
Bất cứ chỗ nào sử dụng việc cộng hai vector, chúng ta đều phải viết lại đoạn code bao màu vàng như ở trên.
Điều đó chưa thực sự được tối ưu.
Nếu dự án, có hàng trăm nơi thực hiện việc cộng hai vector.
Đoạn code trên sẽ bị viết lại cả trăm lần.
Do đó kỹ thuật này giúp những đoạn mã lặp bị giảm bớt, quản lý code dễ dàng hơn, tổ chức được tối ưu rõ rệt.
Và hãy xem cách sử dụng như dưới đây.
Tương tự như vậy tôi có thể định nghĩa ra các phép toán khác như, phép nhân 2 vector,
để ra một giá trị nếu coi đó là tích vô hướng, và ra một vector khác nếu đó là phép tích có hướng.
Hoặc định nghĩa các phép toán gán, so sánh hai vector….
3. Áp dụng kiến thức đã học cho bài toán sau.
=> Hãy viết một lớp định nghĩa các điểm trong không gian 3d, định nghĩa ra các phép toán cộng, trừ, nhân, chia cho 2 điểm.
=> Hãy viết một lớp định nghĩa ra đối tượng là một phân số. sau đó định nghĩa các phép toán cộng, trừ, nhân, chia cho 2 phân số.