24/05/2018, 23:45

Đa năng hóa toán tử một ngôi

Các toán tử một ngôi được đa năng hóa trong hình 4.8 sau: Toán tử Ví dụ Toán tử Ví dụ + +c ~ ~c - ...

Các toán tử một ngôi được đa năng hóa trong hình 4.8 sau:

Toán tử Ví dụ Toán tử Ví dụ
+ +c ~ ~c
- -c ! !a
* *c ++ ++c, c++
& &c -- --c, c--
-> c->    

Hình 4.8: Các toán tử một ngôi được đa năng hóa

Một toán tử một ngôi của lớp được đa năng hóa như một hàm thành viên không tĩnh với không có tham số hoặc như một hàm không thành viên với một tham số; Tham số đó phải hoặc là một đối tượng lớp hoặc là một tham chiếu đến đối tượng lớp.

Ví dụ 4.4:  Lấy lại ví dụ 4.3 và thêm toán tử dấu trừ một ngôi.

CT4_4.CPP1: #include <iostream.h>2: #include <math.h>3:4: class Complex5: {6: private: 7: double Real,Imaginary;8: public: 9: Complex(); // Constructor mặc định10: Complex(double R,double I);11: Complex (const Complex & Z); // Constructor sao chép12: Complex (double R); // Constructor chuyển đổi13: void Print(); // Hiển thị số phức14: // Các toán tử tính toán15: friend Complex operator + (Complex Z1,Complex Z2);16: friend Complex operator - (Complex Z1,Complex Z2);17: Complex operator += (Complex Z);18: Complex operator -= (Complex Z);19: // Toán tử trừ một ngôi20: Complex operator – ();21: // Các toán tử so sánh22: friend int operator == (Complex Z1,Complex Z2);23: friend int operator != (Complex Z1,Complex Z2);24: friend int operator > (Complex Z1,Complex Z2);25: friend int operator >= (Complex Z1,Complex Z2);26: friend int operator < (Complex Z1,Complex Z2);27: friend int operator <= (Complex Z1,Complex Z2);28: private: 29: double Abs(); // Giá trị tuyệt đối của số phức30: };31:32: Complex::Complex()33: {34: Real = 0.0;35: Imaginary = 0.0;36: }37:38: Complex::Complex(double R,double I)39: {40: Real = R;41: Imaginary = I;42: }43:44: Complex::Complex(const Complex & Z)45: {46: Real = Z.Real;47: Imaginary = Z.Imaginary;48: }49:50: Complex::Complex(double R)51: {52: Real = R;53: Imaginary = 0.0;54: }55:56: void Complex::Print()57: {58: cout<<'('<<Real<<','<<Imaginary<<')';59: }60:61: Complex operator + (Complex Z1,Complex Z2)62: {63: Complex Tmp;64:65: Tmp.Real = Z1.Real + Z2.Real;66: Tmp.Imaginary = Z1.Imaginary + Z2.Imaginary;67: return Tmp;68: }69:70: Complex operator - (Complex Z1,Complex Z2)71: {72: Complex Tmp;73:74: Tmp.Real = Z1.Real - Z2.Real;75: Tmp.Imaginary = Z1.Imaginary - Z2.Imaginary;76: return Tmp;77: }78:79: Complex Complex::operator += (Complex Z)80: {81: Real += Z.Real;82: Imaginary += Z.Imaginary;83: return *this;84: }85:86: Complex Complex::operator -= (Complex Z)87: {88: Real -= Z.Real;89: Imaginary -= Z.Imaginary;90: return *this;91: }92:93: Complex Complex::operator - ()94: {95: Complex Tmp;96:97: Tmp.Real = -Real;98: Tmp.Imaginary = -Imaginary;99: return Tmp;100: }101102: int operator == (Complex Z1,Complex Z2)103: {104: return (Z1.Real == Z2.Real) && (Z1.Imaginary == Z2.Imaginary);105: }106:107: int operator != (Complex Z1,Complex Z2)108: {109: return (Z1.Real != Z2.Real) || (Z1.Imaginary != Z2.Imaginary);110: }111:112: int operator > (Complex Z1,Complex Z2)113: {114: return Z1.Abs() > Z2.Abs();115: }116:117: int operator >= (Complex Z1,Complex Z2)118: {119: return Z1.Abs() >= Z2.Abs();120: }121:122: int operator < (Complex Z1,Complex Z2)123: {124: return Z1.Abs() < Z2.Abs();125: }126:127: int operator <= (Complex Z1,Complex Z2)128: {129: return Z1.Abs() <= Z2.Abs();130: }131:132: double Complex::Abs()133: {134: return sqrt(Real*Real+Imaginary*Imaginary);135: }136:137: int main()138: {139: Complex X, Y(4.3,8.2), Z(3.3,1.1);140:141: cout<<"X: ";142: X.Print();143: cout<<endl<<"Y: ";144: Y.Print();145: cout<<endl<<"Z: ";146: Z.Print();147: X = -Y + 3.6;148: cout<<endl<<endl<<"X = -Y + 3.6: ";149: X.Print();150: cout<<" = ";151: (-Y).Print();152: cout<<" + 3.6 ";153: X = -Y + -Z;154: cout<<endl<<"X = -Y + -Z: ";155: X.Print();156: cout<<" = ";157: (-Y).Print();158: cout<<" + ";159: (-Z).Print();160: return 0;161: }

Chúng ta chạy ví dụ 4.4, kết quả ở hình 4.9

Hình 4.9: Kết quả của ví dụ 4.4

Trong phần này chúng ta sẽ tìm hiểu cách cài đặt một vài toán tử đặc biệt như () [] ++ -- , = ->

Toán tử []:

Khi cài đặt các lớp vector hoặc chuỗi ký tự, chúng ta cần phải truy cập đến từng phần tử của chúng, trong ngôn ngữ C/C++ đã có toán tử [] để truy cập đến một phần tử của mảng. Đây là toán tử hai ngôi, có dạng a[b] và khi đa năng toán tử này thì hàm toán tử tương ứng phải là thành viên của một lớp.

Ví dụ 4.5:  Đa năng hóa toán tử [] để truy cập đến một phần tử của vector.

CT4_5.CPP1: #include <iostream.h>2: 3: class Vector4: {5: private: 6: int Size;7: int *Data;8: public: 9: Vector(int S=2,int V=0);10: ~Vector();11: void Print() const;12: int & operator [] (int I);13: };14:15: Vector::Vector(int S,int V)16: {17: Size = S;18: Data=new int[Size];19: for(int I=0;I<Size;++I)20: Data[I]=V;21: }22:23: Vector::~Vector()24: {25: delete []Data;26: }27: void Vector::Print() const28: {29: cout<<"Vector:(";30: for(int I=0;I<Size-1;++I)31: cout<<Data[I]<<",";32: cout<<Data[Size-1]<<")"<<endl;33: }34:35: int & Vector::operator [](int I)36: {37: return Data[I];38: }39:40: int main()41: {42: Vector V(5,1);43: V.Print();44: for(int I=0;I<5;++I)45: V[I]*=(I+1);46: V.Print();47: V[0]=10;48: V.Print();49: return 0;50: }

Chúng ta chạy ví dụ 4.5, kết quả ở hình 4.10

Hình 4.10: Kết quả của ví dụ 4.5

Trong chương trình ở ví dụ 4.5, hàm toán tử của toán tử [] ở lớp Vector trả về một tham chiếu vì toán tử này có thể dùng ở vế trái của phép gán.

Toán tử ()

Toán tử () được dùng để gọi hàm, toán tử này gồm hai toán hạng: toán hạng đầu tiên là tên hàm, toán hạng thứ hai là danh sách các tham số của hàm. Toán tử này có dạng giống như toán tử [] và khi đa năng toán tử này thì hàm toán tử tương ứng phải là thành viên của một lớp.

Ví dụ 4.6:  Lấy lại ví dụ 4.5 nhưng đa năng hóa toán tử () để truy cập đến một phần tử của vector.

CT4_6.CPP1: #include <iostream.h>2: 3: class Vector4: {5: private: 6: int Size;7: int *Data;8: public: 9: Vector(int S=2,int V=0);10: ~Vector();11: void Print() const;12: int & operator () (int I);13: };14:15: Vector::Vector(int S,int V)16: {17: Size = S;18: Data=new int[Size];19: for(int I=0;I<Size;++I)20: Data[I]=V;21: }22:23: Vector::~Vector()24: {25: delete []Data;26: }27: void Vector::Print() const28: {29: cout<<"Vector:(";30: for(int I=0;I<Size-1;++I)31: cout<<Data[I]<<",";32: cout<<Data[Size-1]<<")"<<endl;33: }34:35: int & Vector::operator ()(int I)36: {37: return Data[I];38: }39:40: int main()41: {42: Vector V(5,1);43: V.Print();44: for(int I=0;I<5;++I)45: V(I)*=(I+1);46: V.Print();47: V(0)=10;48: V.Print();49: return 0;50: }

Chúng ta chạy ví dụ 4.6, kết quả ở hình 4.11

Hình 4.11: Kết quả của ví dụ 4.6

Ví dụ 4.7: Đa năng hóa toán tử () để truy cập đến phần tử của ma trận.

CT4_7.CPP1: #include <iostream.h>2: 3: class Matrix4: {5: private: 6: int Rows,Cols;7: int **Data;8: public: 9: Matrix(int R=2,int C=2,int V=0);10: ~Matrix();11: void Print() const;12: int & operator () (int R,int C);13: };14:15: Matrix::Matrix(int R,int C,int V)16: {17: int I,J;18: Rows=R;19: Cols=C;20: Data = new int *[Rows];21: int *Temp=new int[Rows*Cols];22: for(I=0;I<Rows;++I)23: {24: Data[I]=Temp;25: Temp+=Cols;26: }27: for(I=0;I<Rows;++I)28: for(J=0;J<Cols;++J)29: Data[I][J]=V;30: } 31:32: Matrix::~Matrix()33: {34: delete [] Data[0];35: delete [] Data;36: }37:38: void Matrix::Print() const39: {40: int I,J;41: for(I=0;I<Rows;++I)42: {43: for(J=0;J<Cols;++J)44: {45: cout.awidth(5); // Hiển thị canh lề phải với chiều dài 5 ký tự46: cout<<Data[I][J];47: }48: cout<<endl;49: }50: }51:52: int & Matrix::operator () (int R,int C)53: {54: return Data[R][C];55: }56:57: int main()58: {59: int I,J;60: Matrix M(2,3,1);61: cout<<"Matrix:"<<endl;62: M.Print();63: for(I=0;I<2;++I)64: for(J=0;J<3;++J)65: M(I,J)*=(I+J+1);66: cout<<"Matrix:"<<endl;67: M.Print();68: return 0;69: }

Chúng ta chạy ví dụ 4.7, kết quả ở hình 4.12

Hình 4.12: Kết quả của ví dụ 4.7

Toán tử ++ và --

Cài đặt các phép toán ++-- cũng tương tự như các toán tử khác.

Ví dụ 4.8: Đa năng hóa toán tử ++ --

CT4_8.CPP1: #include <iostream.h> 2:3: class Point4: {5: private:6: int X,Y;7: public:8: Point(int A=0,int B=0);9: Point operator ++();10: Point operator --();11: void Print() const;12: };13:14: Point::Point(int A,int B)15: {16: X = A;17: Y = B;18: }19:20: Point Point::operator++()21: {22: ++X;23: ++Y;24: return *this;25: }26:27: Point Point::operator--()28: {29: --X;30: --Y;31: return *this;32: }33:34: void Point::Print() const35: {36: cout<<"X="<<X<<",Y="<<Y<<endl;37: }38:39: int main()40: {41: Point P1(2,6),P2(5,8);42: cout<<"Point 1:";43: P1.Print();44: cout<<"Point 2:";45: P2.Print();46: ++P1;47: --P2;48: cout<<"Point 1:";49: P1.Print();50: cout<<"Point 2:";51: P2.Print();52: return 0;53: }

Chúng ta chạy ví dụ 4.8, kết quả ở hình 4.13

Hình 4.13: Kết quả của ví dụ 4.8

Tuy nhiên ở ví dụ 4.8, không phân biệt được các toán tử ++ -- khi ở dạng tiền tố và hậu tố. Để có thể phân biệt được tiền tố và hậu tố khi đa năng hóa, toán tử ++a (hoặc --a) là toán tử một ngôi, còn toán tử a++ (hoặc a--) được xem là toán tử hai ngôi trong đó toán hạng thứ hai kiểu int.

Ví dụ 4.9: Đa năng hóa toán tử ++ có phân biệt tiền tố và hậu tố.

CT4_9.CPP1: #include <iostream.h> 2:3: class Point4: {5: private:6: int X,Y;7: public:8: Point(int A=0,int B=0);9: Point operator ++();10: Point operator ++(int); //Hậu tố11: Point operator --(); //Tiền tố12: Point operator --(int); //Hậu tố13: void Print() const;14: };15:16: Point::Point(int A,int B)17: {18: X = A;19: Y = B;20: }21:22: Point Point::operator++()23: {24: ++X;25: ++Y;26: return *this;27: }28:29: Point Point::operator++(int)30: {31: Point Tmp=*this; //Sao chép đối tượng đang xét vào đối tượng 32: //tạm thời trước khi thay đổi33: ++X;34: ++Y;35: return Tmp;36: }37: 38: Point Point::operator--()39: {40: --X;41: --Y;42: return *this;43: }44:45: Point Point::operator--(int)46: {47: Point Tmp=*this; //Sao chép đối tượng đang xét vào đối tượng48: //tạm thời trước khi thay đổi49: --X;50: --Y;51: return Tmp;52: }53:54: void Point::Print() const55: {56: cout<<"X="<<X<<",Y="<<Y<<endl;57: }58:59: int main()60: {61: Point P1(2,6),P2(5,8),P3,P4;62: cout<<"Point 1:";63: P1.Print();64: cout<<"Point 2:";65: P2.Print();66: cout<<"Point 3:";67: P3.Print();68: cout<<"Point 4:";69: P4.Print();70: P3=++P1;71: P4=P2++;72: cout<<"Point 1:";73: P1.Print();74: cout<<"Point 2:";75: P2.Print();76: cout<<"Point 3:";77: P3.Print();78: cout<<"Point 4:";79: P4.Print();80: return 0; 81: }

Chúng ta chạy ví dụ 4.9, kết quả ở hình 4.14

Hình 4.14: Kết quả của ví dụ 4.9

0