Các toán tử được phép chồng chất |
+ - * / = < > += -= *= /= << >> <<= >>= == != <= >= ++ – % & ^ ! | ~ &= ^= |= || && %= [] () , ->* -> new delete new[] delete[] |
type operator toán_tử(tham số){…thân hàm…} |
Ví dụ sau đây sẽ minh họa cho việc chồng chất toán tử. Chúng ta sẽ xây dựng một lớp số phức, xây dựng các phép toán cộng hai số phức (phép toán hai ngôi) và phép tăng số phức lên 1 đơn vị thực và 1 đơn vị ảo(phép toán một ngôi) bằng cách sử dụng chồng chất toán tử.
Ví dụ | Kết quả |
#include class Complex{ float real; float img; public: Complex(float, float); Complex operator +(const Complex&); Complex operator ++(void); void toString(void); }; Complex::Complex(float a, float b){ real = a; img = b; } Complex Complex::operator +(const Complex& b){ Complex c(0, 0); c.real = real + b.real; c.img = img + b.img; return c; } Complex Complex::operator ++(void){ Complex c(0, 0); c.real += ++real; c.img += ++img; return c; } void Complex::toString(void){ cout< } int main(){ Complex a(3, 2); Complex b(-1, 1); (a+b).toString(); (++a).toString(); return 0; } | 2 + 3*I 4 + 3*I |
(a+ ++b+(a+b)).toString(); |
Complex Complex::operator +(const Complex& b){ return Complex(real + b.real, img + b.img); } Complex Complex::operator ++(void){ return Complex(++real, ++img); } |
Việc sử dụng chồng chất toán tử như là hàm thành viên áp dụng cho tất cả các toán tử mà C++ hỗ trợ. Trừ các toán tử gán, hợp nhất, () và ->. Các toán tử còn lại cũng áp dụng cho các hàm toàn cục. Hàm toàn cục cũng như hàm thành viên, nhưng nó không thuộc một lớp nào. Việc khai báo hàm toàn cục sẽ được thực hiện như sau
type operator@(A) |
Ví dụ | Kết quả |
#include class Complex{ public: float real; float img; Complex(float, float); Complex operator -(const Complex&); void toString(void); }; Complex::Complex(float a, float b){ real = a; img = b; } void Complex::toString(void){ cout< } Complex operator -(const Complex &a, const Complex &b){ return Complex(a.real – b.real, a.img – b.img); } int main(){ Complex a(3, 2); Complex b(-1, 1); (a-b).toString(); return 0; } | 4 + 1*I |
Một điều mà bạn cần lưu ý, đối với toán tử IO overloading (toán tử nhập xuất), chúng ta có một số chú ý:
+ Nếu bạn khai báo hàm toán tử là một thành viên của lớp.
Ví dụ | Kết quả |
#include class Vector2D{ private: int x, y; public: Vector2D(){ x = 0; y = 0; } Vector2D(int x1, int y1){ x = x1; y = y1; } ostream& operator<<(ostream& os){ os<<”(“< } }; int main() { Vector2D ab(4, 5); //ab.operator<<(cout); ab<<(cout); return 0; } | (4, 5) |
+ Nếu bạn khai báo hàm toán tử không phải là thành viên của lớp.
Ví dụ | Kết quả |
#include class Vector2D{ private: int x, y; public: Vector2D(){ x = 0; y = 0; } Vector2D(int x1, int y1){ x = x1; y = y1; } friend ostream& operator<<(ostream&, const Vector2D&); }; ostream& operator<<(ostream& os, const Vector2D& v){ os<<”(“< } int main() { Vector2D ab(4, 5); cout< return 0; } | (4, 5) |
Khi sử dụng toán tử nhập dữ liệu >> (hay toán tử trích tách dữ liệu), bạn khai báo hoàn toàn tương tự. Kiểu dữ liệu trả về lúc này là istream& thay vì bạn sử dụng ostream& như trên. Bạn tiến hành nhập dữ liệu cho nên tham số Vector2D trong hàm bạn cũng cần thay đổi – bạn hãy bỏ đi từ khóa const bởi lẽ bạn đang tiến hành nhập dữ liệu cho nó nên không thể quy định truyền giá trị theo tham số hằng.
Ví dụ | Kết quả |
#include class Vector2D{ private: int x, y; public: Vector2D(){ this->x = 0; this->y = 0; } Vector2D(int x, int y){ this->x = x; this->y = y; } friend istream& operator >> (istream&, const Vector2D&); }; ostream& operator >> (istream& is, const Vector2D& v){ os >> v.x return is; } int main() { Vector2D ab(4, 5); cin >> } | (4, 5) |
No comments:
Post a Comment