Thao tác dịch chuyển vector không dùng từ khóa toán tử
Xây dựng lớp vector thực hiện tính toán cơ bản mà không dùng từ khóa toán tử yêu cầu định nghĩa phương thức riêng. Cách tiếp cận này có thể khiến mã lệnh trở nên quá dài dòng và giảm tính trực quan.
#include<iostream>
#include<string>
struct Vec2D {
float toadox, toadoy;
Vec2D(float tx, float ty) : toadox(tx), toadoy(ty) {}
Vec2D Cong(const Vec2D& khac) const {
return Vec2D(toadox + khac.toadox, toadoy + khac.toadoy);
}
Vec2D Nhan(const Vec2D& khac) const {
return Vec2D(toadox * khac.toadox, toadoy * khac.toadoy);
}
};
int main() {
Vec2D vitri(4.0f, 4.0f);
Vec2D tocdo(0.5f, 1.5f);
Vec2D uplanh(1.1f, 1.1f);
Vec2D ketqua = vitri.Cong(tocdo.Nhan(uplanh));
std::cin.get();
}
Tái định nghĩa toán tử cơ bản
Tái định nghĩa toán tử được thực hiện bằng cách định nghĩa hàm với ký hiệu đặc biệt. Phương pháp này cho phép sử dụng ký hiệu toán học quen thuộc giúp mã lệnh trở nên ngắn gọn và dễ hiểu hơn.
struct Vec2D {
float toadox, toadoy;
Vec2D(float tx, float ty) : toadox(tx), toadoy(ty) {}
Vec2D operator+(const Vec2D& khac) const {
return Vec2D(toadox + khac.toadox, toadoy + khac.toadoy);
}
};
Cơ chế hoán đổi phương thức
Có thể triển khai cả phương thức thông thường và toán tử tương ứng, gọi chéo giữa chúng để tăng tính linh hoạt của lớp.
struct Vec2D {
float toadox, toadoy;
Vec2D(float tx, float ty) : toadox(tx), toadoy(ty) {}
Vec2D Cong(const Vec2D& khac) const {
return *this + khac;
}
Vec2D operator+(const Vec2D& khac) const {
return Vec2D(toadox + khac.toadox, toadoy + khac.toadoy);
}
};
Sử dụng tường minh toán tử bên trong lớp
Có thể gọi rõ ràng toán tử đã định nghĩa bằng cú pháp đặc biệt để tránh nhầm lẫn:
struct Vec2D {
// ...Các thành phần khác...
Vec2D Cong(const Vec2D& khac) const {
return operator+(khac);
}
};
Triển khai toán tử nhân và toán tử xuất
Mở rộng lớp với toán tử nhân và định nghĩa toán tử xuất để hiển thị đối tượng ra luồng:
struct Vec2D {
// ...Các toán tử khác...
Vec2D operator*(const Vec2D& khac) const {
return Vec2D(toadox * khac.toadox, toadoy * khac.toadoy);
}
};
std::ostream& operator<<(std::ostream& os, const Vec2D& v) {
os << v.toadox << "," << v.toadoy;
return os;
}
Kiểm tra sự tương đồng vector
Định nghĩa toán tử so sánh == và != để kiểm tra điều kiện tương đương giữa các đối tượng:
struct Vec2D {
// ...Các toán tử khác...
bool operator==(const Vec2D& khac) const {
return toadox == khac.toadox && toadoy == khac.toadoy;
}
bool operator!=(const Vec2D& khac) const {
return !(*this == khac);
}
};