SlideShare una empresa de Scribd logo
1 de 18
CHƯƠNG 8:

                                     TÁI ĐỊNH NGHĨA
                                        (OVERLOADING)
           Bộ môn Hệ Thống Máy Tính và Truyền Thông
           Khoa Công Nghệ Thông Tin và Truyền Thông
           Đại học Cần Thơ




Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ              1
Chương 8


                                     Nội dung
      Tái định nghĩa hàm.
      Tái định nghĩa toán tử.
      Chuyển đổi kiểu.
      Tái định nghĩa toán tử xuất (<<)– nhập (>>)
      Tái định nghĩa toán tử [], toán tử ()
      Khởi tạo ngầm định - Gán ngầm định.
      Tái định nghĩa toán tử ++ và --
      Tái định nghĩa new và delete
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ           2
Chương 8


                     Tái định nghĩa hàm
   Định nghĩa các hàm cùng tên
   Đối số phải khác nhau:
              Số lượng                               Kiểu
              Thứ tự
 class Time {                                           void main() {
     //...                                                int h, m, s;
     long GetTime (void); // số giây tính từ nửa đêm      long t = GetTime(); // Gọi hàm ???
     void GetTime (int &hours,                            GetTime(h, m, s); // Gọi hàm ???
                   int &minutes,                        }
                   int &seconds);
 };


      Có thể dùng đối số mặc định.
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                               3
Chương 8


                  Tái định nghĩa toán tử
   Định nghĩa các phép toán trên đối tượng.
   Các phép toán có thể tái định nghĩa:

                       +        -     *      !        ~    &    ++   --   ()    ->    ->*
          Đơn
          hạng       new         delete

                       +        -     *      /        %    &    |    ^    <<    >>

          Nhị          =        +=    -=     /=       %=   &=   |=   ^=   <<=   >>=
          hạng
                      ==        !=    <      >        <=   >=   &&   ||   []    ()     ,


      Các phép toán không thể tái định nghĩa:
              .            .*        ::          ?:        sizeof
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                  4
Chương 8


          Tái định nghĩa toán tử (tt)
      Bằng hàm thành viên:
         class Point {
              public:
                   Point (int x, int y) { Point::x = x; Point::y = y; }
                   Point operator + (Point &p) { return Point(x + p.x,y + p.y); }
                   Point operator - (Point &p) { return Point(x - p.x, y - p.y); }
              private:
                   int x, y;
         };
                                                                              Có 1 tham số
                                                                        (Nếu là toán tử nhị hạng)
         void main() {
             Point p1(10,20), p2(10,20);
             Point p3 = p1 + p2;            Point p4 = p1 - p2;
             Point p5 = p3.operator + (p4); Point p6 = p3.operator – (p4);
         };


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                     5
Chương 8


          Tái định nghĩa toán tử (tt)
      Bằng hàm độc lập: thường khai báo friend
         class Point {
              public:
                    Point (int x, int y)  { Point::x = x; Point::y = y; }
                    friend Point operator + (Point &p, Point &q)
                                {return Point(p.x + q.x,p.y + q.y); }
                    friend Point operator - (Point &p, Point &q)
                                {return Point(p.x - q.x,p.y - q.y); }
               private:
                                                                                Có 2 tham số
                    int x, y;
                                                                          (Nếu là toán tử nhị hạng)
         };

         void main() {
             Point p1(10,20), p2(10,20);
             Point p3 = p1 + p2;            Point p4 = p1 - p2;
             Point p5 =operator + (p3, p4); Point p6 = operator – (p3, p4);
         };

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                       6
Chương 8


          Tái định nghĩa toán tử (tt)
      Cải tiến lớp tập hợp (Set):
 #include <iostream.h>                                            // Định nghĩa các toán tử
 const       maxCard = 100;                                       ……………….
 enum        Bool {false, true};                                  ……………….
 class Set {                                                      int main (void)
    public:
                                                                  { Set         s1, s2, s3;
      Set(void) { card = 0; }
                                                                     s1.AddElem(10); s1.AddElem(20);
      friend Bool operator & (const int, Set&);// thanh vien ?
                                                                     s1.AddElem(30); s1.AddElem(40);
      friend Bool operator == (Set&, Set&); // bang ?
                                                                     s2.AddElem(30); s2.AddElem(50);
      friend Bool operator != (Set&, Set&);     // khong bang ?
                                                                     s2.AddElem(10); s2.AddElem(60);
      friend Set operator * (Set&, Set&);      // giao
      friend Set operator + (Set&, Set&);     // hop                 cout << "s1 = ";       s1.Print();
      //...                                                          cout << "s2 = ";       s2.Print();
      void AddElem(const int elem);                                  if (20 & s1) cout << "20 thuoc s1n";
      void Copy (Set &set);                                          cout << "s1 giao s2 = "; (s1 * s2).Print();
      void Print (void);                                             cout << "s1 hop s2 = "; (s1 + s2).Print();
    private:
      int elems[maxCard];                                            if (s1 != s2) cout << "s1 /= s2n";
      int card;                                                      return 0;
 };                                                               }

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                                7
Chương 8


                                Chuyển kiểu
      Muốn thực hiện các phép cộng:
                            void main() {
                                Point p1(10,20), p2(30,40), p3, p4, p5;
                                p3 = p1 + p2;
                                p4 = p1 + 5; p5 = 5 + p1;
                            };



                 Có thể định nghĩa thêm 2 toán tử:
                  class Point {
                            //...
                            friend Point operator + (Point, Point);
                            friend Point operator + (int, Point);
                            friend Point operator + (Point, int);
                  };


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                8
Chương 8


                          Chuyển kiểu (tt)
      Chuyển đổi kiểu: ngôn ngữ định nghĩa sẵn.
                           void main() {
                               Point p1(10,20), p2(30,40), p3, p4, p5;
                               p3 = p1 + p2;
                               p4 = p1 + 5; // tương đương p1 + Point(5)
                               p5 = 5 + p1; // tương đương Point(5) + p1
                            }


              Định nghĩa phép chuyển đổi kiểu
                       class Point {
                             //...                                         Chuyển kiểu
                            Point (int x) { Point::x = Point::y = x; }     5  Point(5)
                            friend Point operator + (Point, Point);
                        };

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                9
Chương 8


   Tái định nghĩa toán tử xuất <<
      Định nghĩa hàm toàn cục:
        ostream& operator << (ostream&, Class&);
   class Point {                                           void main() {
      public:                                                  Point p1(10,20), p2;
           Point (int x=0, int y=0)                            cout<<“Diem P1: “<< p1 << endl;
               { Point::x = x; Point::y = y; }                 cout<<“Diem P2: “<< p2 << endl;
           friend ostream& operator <<                     }
                    (ostream& os, Point& p)
               { os<< “(“ << p.x << “,” << p.y << “)”; }
           // …..
      private:                                                          Kết quả
         int x, y;                                                       trên
   };                                                                  màn hình ?



Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                  10
Chương 8


   Tái định nghĩa toán tử nhập >>
      Định nghĩa hàm toàn cục:
        istream& operator >> (istream&, Class&);
   class Point {                                 void main() {
      public:                                        Point p1, p2;
           Point (int x=0, int y=0)                  cout<<“Nhap thong tin cho P1: n“;
               { Point::x = x; Point::y = y; }       cin>>p1;
           friend istream& operator >>               cout<<“Nhap thong tin cho P2: n“;
                    (istream& is, Point& p)          cin>>p2;
               { cout<<“Nhap x: “; is>>p.x;       }
                  cout<<“Nhap y: “; is>>p.y;
               }
           // …..
      private:
         int x, y;
   };

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                         11
Chương 8


            Tái định nghĩa toán tử [ ]
      Thông thường để xuất ra giá trị của 1 phần tử tại
       vị trí cho trước trong đối tượng.
      Định nghĩa là hàm thành viên.
class StringVec {                                    char* StringVec::operator [] (int i) {
    public:                                              if ( i>=0 && i<used) return elems[i];
          StringVec (const int dim);                     return “”;
          ~StringVec ();                              }
          char* operator [] (int);
          int add(char* );                           void main() {
          // ………..                                     StringVec sv1(100);
    private:                                           sv1.add(“PTPhi”);sv1.add(“BQThai”);
          char **elems; // cac phan tu                 sv1.add(“LVLam”); sv1.add(“NCHuy”);
          int     dim;     // kich thuoc cua vecto     cout<< sv1[2]<<endl;
          int     used;    // vi tri hien tai          cout<<sv1[0];
 };                                                  }

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                              12
Chương 8


             Tái định nghĩa toán tử ()
      Định nghĩa là hàm thành viên.
class Matrix {                                            double& Matrix::operator ()
   public:                                                   (const short row, const short col)
       Matrix (const short rows, const short cols);        {
       ~Matrix (void) {delete elems;}                         static double dummy = 0.0;
       double& operator () (const short row,                  return (row >= 1 && row <= rows
                             const short col);                      && col >= 1 && col <= cols)
                                                                     ? elems[(row - 1)*cols
       friend ostream& operator << (ostream&, Matrix&);
                                                                             + (col - 1)]
       friend Matrix operator + (Matrix&, Matrix&);                   : dummy;
       friend Matrix operator - (Matrix&, Matrix&);        }
       friend Matrix operator * (Matrix&, Matrix&);       void main() {
   private:                                                  Matrix m(3,2);
       const short    rows;       // số hàng                 m(1,1) = 10; m(1,2) = 20;
       const short    cols;       // số cột                  m(2,1) = 30; m(2,2) = 40;
       double         *elems;     // các phần tử             m(3,1) = 50; m(3,2) = 60;
};                                                           cout<<m<<endl;
                                                          }

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                               13
Chương 8


                    Khởi tạo ngầm định
      Được định nghĩa sẵn trong ngôn ngữ:
       VD: Point p1(10,20); Point p2 = p1;
      Sẽ gây ra lỗi (kết quả SAI) khi bên trong đối tượng
       có thành phần dữ liệu là con trỏ.
                                     trỏ
       VD: Matrix m(5,6); Matrix n = m;


          Lỗi sẽ xảy ra do
           khởi tạo ngầm
          bằng cách gán
         tương ứng từng
            thành phần.



Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ             14
Chương 8


              Khởi tạo ngầm định (tt)
                   Khi lớp có thành phần dữ liệu con trỏ,
                                                     trỏ
                   phải định nghĩa hàm xây dựng sao chép

    class Point {                        class Matrix {
         int x, y;                           //….
       public:                               Matrix(const Matrix&);
         Point (int =0; int =0 );        };
         // Khong can thiet DN           Matrix::Matrix (const Matrix &m)
         Point (const Point& p) {            : rows(m.rows), cols(m.cols)
               x= p.x;                    {
               y = p.y;                        int n = rows * cols;
           }                                   elems = new double[n];           // cùng kích thước
         // ………..                              for (register i = 0; i < n; ++i) // sao chép phần tử
    };                                               elems[i] = m.elems[i];
    // ……………                               }


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                       15
Chương 8


                             Gán ngầm định
      Được định nghĩa sẵn trong ngôn ngữ:
            Gán tương ứng từng thành phần.
            Đúng khi đối tượng không có dữ liệu con trỏ.
             VD: Point p1(10,20); Point p2; p2 = p1;
      Khi thành phần dữ liệu có con trỏ, bắt buộc phải
       định nghĩa phép gán = cho lớp.
                       class Matrix {
                           //….
        Hàm                  Matrix& operator = (const Matrix &m) {
       thành                      if (rows == m.rows && cols == m.cols) {            // phải khớp
        viên                             int n = rows * cols;
                                         for (register i = 0; i < n; ++i) // sao chép các phần tử
                                             elems[i] = m.elems[i];
                                     }
                                  return *this;
                              }
                        };
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                          16
Chương 8


    Tái định nghĩa toán tử ++ & --
      Toán tử ++ (hoặc toán tử --) có 2 loại:
            Tiền tố: ++n
            Hậu tố: n++
      class PhanSo {                                    void main() {
          int tuso, mau so;                                 PhanSo p1(3,4), p2;
         public:
             // …..                                         cout<< p1++;
            PhanSo(int=0 , int =1);                         cout<<++p2;
            friend PhanSo operator ++ (PhanSo&);            cout<<++(p1++) + (++p2)++;
            friend PhanSo operator ++ (PhanSo&, int);    }
       };
      PhanSo operator ++ (PhanSo& p) {
          return (p = PhanSo(tuso+mauso, mauso));
      }
      PhanSo operator ++ (PhanSo& p, int x) {                     Kết quả trên
          PhanSo p2 = PhanSo(tuso+mauso, mauso);                  màn hình ?
          return p2;
      }

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                               17
Chương 8


       Tái định nghĩa new & delete
      Hàm new và delete mặc định của ngôn ngữ:
         Nếu đối tượng kích thước nhỏ, có thể sẽ gây ra quá
         nhiều khối nhỏ => chậm.
         Không đáng kể khi đối tượng có kích thước lớn.

       => Toán tử new và delete ít được tái định nghĩa.
      Định nghĩa theo dạng hàm thành viên:
    class Point {                                             void main() {
        public:                                                 Point *p = new Point(10,20);
            //...                                               Point *ds = new Point[30];
            void* operator new (size_t bytes);                  //………………
            void operator delete (void *ptr, size_t bytes);     delete p;
        private:                                                delete []ds;
            int xVal, yVal;                                   }
    };

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                18

Más contenido relacionado

La actualidad más candente

Hướng dẫn làm bt về chuỗi.doc
Hướng dẫn làm bt về chuỗi.docHướng dẫn làm bt về chuỗi.doc
Hướng dẫn làm bt về chuỗi.docTrần Văn Nam
 
Nmlt C03 Cac Kieu Du Lieu Co So
Nmlt C03 Cac Kieu Du Lieu Co SoNmlt C03 Cac Kieu Du Lieu Co So
Nmlt C03 Cac Kieu Du Lieu Co SoCuong
 
Bài tập CTDL và GT 8
Bài tập CTDL và GT 8Bài tập CTDL và GT 8
Bài tập CTDL và GT 8Hồ Lợi
 
Nmlt C08 Mang2 Chieu
Nmlt C08 Mang2 ChieuNmlt C08 Mang2 Chieu
Nmlt C08 Mang2 ChieuCuong
 
Nmlt C06 Ham
Nmlt C06 HamNmlt C06 Ham
Nmlt C06 HamCuong
 
3 Function
3 Function3 Function
3 FunctionCuong
 
Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Minh Ngoc Tran
 
Bai tap lam quen java
Bai tap lam quen javaBai tap lam quen java
Bai tap lam quen javaTuấn Bùi
 

La actualidad más candente (15)

Hướng dẫn làm bt về chuỗi.doc
Hướng dẫn làm bt về chuỗi.docHướng dẫn làm bt về chuỗi.doc
Hướng dẫn làm bt về chuỗi.doc
 
Tut4 solution
Tut4 solutionTut4 solution
Tut4 solution
 
Tut6 solution
Tut6 solutionTut6 solution
Tut6 solution
 
Nmlt C03 Cac Kieu Du Lieu Co So
Nmlt C03 Cac Kieu Du Lieu Co SoNmlt C03 Cac Kieu Du Lieu Co So
Nmlt C03 Cac Kieu Du Lieu Co So
 
Ktlt lab full
Ktlt lab fullKtlt lab full
Ktlt lab full
 
Lesson07
Lesson07Lesson07
Lesson07
 
Bài tập CTDL và GT 8
Bài tập CTDL và GT 8Bài tập CTDL và GT 8
Bài tập CTDL và GT 8
 
Nmlt C08 Mang2 Chieu
Nmlt C08 Mang2 ChieuNmlt C08 Mang2 Chieu
Nmlt C08 Mang2 Chieu
 
Nmlt C06 Ham
Nmlt C06 HamNmlt C06 Ham
Nmlt C06 Ham
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinking
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithms
 
3 Function
3 Function3 Function
3 Function
 
Tn ktlt
Tn ktltTn ktlt
Tn ktlt
 
Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3Lap trinh c++ có lời giải 3
Lap trinh c++ có lời giải 3
 
Bai tap lam quen java
Bai tap lam quen javaBai tap lam quen java
Bai tap lam quen java
 

Destacado

Indoor Visitor Tracking
Indoor Visitor Tracking Indoor Visitor Tracking
Indoor Visitor Tracking anjaneshbabu
 
The future of real estate
The future of real estateThe future of real estate
The future of real estatepsamiam
 
Augmented Reality IFITTtalk@Manchester
Augmented Reality IFITTtalk@ManchesterAugmented Reality IFITTtalk@Manchester
Augmented Reality IFITTtalk@Manchesteranjaneshbabu
 
Public Wi-Fi-University-Museums-and-Super-Connected-Oxford
Public Wi-Fi-University-Museums-and-Super-Connected-OxfordPublic Wi-Fi-University-Museums-and-Super-Connected-Oxford
Public Wi-Fi-University-Museums-and-Super-Connected-Oxfordanjaneshbabu
 
Chuong 05 de quy
Chuong 05 de quyChuong 05 de quy
Chuong 05 de quyCau Chu Nho
 

Destacado (6)

Indoor Visitor Tracking
Indoor Visitor Tracking Indoor Visitor Tracking
Indoor Visitor Tracking
 
The future of real estate
The future of real estateThe future of real estate
The future of real estate
 
Augmented Reality IFITTtalk@Manchester
Augmented Reality IFITTtalk@ManchesterAugmented Reality IFITTtalk@Manchester
Augmented Reality IFITTtalk@Manchester
 
Public Wi-Fi-University-Museums-and-Super-Connected-Oxford
Public Wi-Fi-University-Museums-and-Super-Connected-OxfordPublic Wi-Fi-University-Museums-and-Super-Connected-Oxford
Public Wi-Fi-University-Museums-and-Super-Connected-Oxford
 
Lesson01
Lesson01Lesson01
Lesson01
 
Chuong 05 de quy
Chuong 05 de quyChuong 05 de quy
Chuong 05 de quy
 

Similar a Lesson08

Similar a Lesson08 (20)

Lesson08
Lesson08Lesson08
Lesson08
 
Lesson07
Lesson07Lesson07
Lesson07
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07Lap trinh huong_doi_tuong_cpp_dhct_lesson07
Lap trinh huong_doi_tuong_cpp_dhct_lesson07
 
C10 generic algorithms
C10 generic algorithmsC10 generic algorithms
C10 generic algorithms
 
Cpl test1%20key
Cpl test1%20keyCpl test1%20key
Cpl test1%20key
 
Bài tập ôn lập trình
Bài tập ôn lập trìnhBài tập ôn lập trình
Bài tập ôn lập trình
 
Chuong7
Chuong7Chuong7
Chuong7
 
Bai tap java
Bai tap javaBai tap java
Bai tap java
 
Lec3. Ham.pdf
Lec3. Ham.pdfLec3. Ham.pdf
Lec3. Ham.pdf
 
C đến C++ phần 1
C đến C++ phần 1C đến C++ phần 1
C đến C++ phần 1
 
Powerpoint dạy hoc
Powerpoint dạy hocPowerpoint dạy hoc
Powerpoint dạy hoc
 
Session 4
Session 4Session 4
Session 4
 
Lập trình hướng đối tượng - p3
Lập trình hướng đối tượng - p3Lập trình hướng đối tượng - p3
Lập trình hướng đối tượng - p3
 
Chương Trình Con
Chương Trình Con Chương Trình Con
Chương Trình Con
 
344444
344444344444
344444
 
Chuyen doi he so
Chuyen doi he soChuyen doi he so
Chuyen doi he so
 
Nmlt c15 ham_nangcao_phan2_in
Nmlt c15 ham_nangcao_phan2_inNmlt c15 ham_nangcao_phan2_in
Nmlt c15 ham_nangcao_phan2_in
 
Fortran cơ sở
Fortran cơ sởFortran cơ sở
Fortran cơ sở
 
C8 object-oriented thinking
C8 object-oriented thinkingC8 object-oriented thinking
C8 object-oriented thinking
 
Chuong3 c
Chuong3 c Chuong3 c
Chuong3 c
 

Más de Cau Chu Nho

Más de Cau Chu Nho (7)

Lesson06
Lesson06Lesson06
Lesson06
 
Lesson05
Lesson05Lesson05
Lesson05
 
Lesson04
Lesson04Lesson04
Lesson04
 
Lesson02
Lesson02Lesson02
Lesson02
 
Lesson00
Lesson00Lesson00
Lesson00
 
c3 mang2 chieu
c3 mang2 chieuc3 mang2 chieu
c3 mang2 chieu
 
Mang1 chieu
Mang1 chieuMang1 chieu
Mang1 chieu
 

Lesson08

  • 1. CHƯƠNG 8: TÁI ĐỊNH NGHĨA (OVERLOADING) Bộ môn Hệ Thống Máy Tính và Truyền Thông Khoa Công Nghệ Thông Tin và Truyền Thông Đại học Cần Thơ Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 1
  • 2. Chương 8 Nội dung  Tái định nghĩa hàm.  Tái định nghĩa toán tử.  Chuyển đổi kiểu.  Tái định nghĩa toán tử xuất (<<)– nhập (>>)  Tái định nghĩa toán tử [], toán tử ()  Khởi tạo ngầm định - Gán ngầm định.  Tái định nghĩa toán tử ++ và --  Tái định nghĩa new và delete Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 2
  • 3. Chương 8 Tái định nghĩa hàm  Định nghĩa các hàm cùng tên  Đối số phải khác nhau:  Số lượng  Kiểu  Thứ tự class Time { void main() { //... int h, m, s; long GetTime (void); // số giây tính từ nửa đêm long t = GetTime(); // Gọi hàm ??? void GetTime (int &hours, GetTime(h, m, s); // Gọi hàm ??? int &minutes, } int &seconds); };  Có thể dùng đối số mặc định. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 3
  • 4. Chương 8 Tái định nghĩa toán tử  Định nghĩa các phép toán trên đối tượng.  Các phép toán có thể tái định nghĩa: + - * ! ~ & ++ -- () -> ->* Đơn hạng new delete + - * / % & | ^ << >> Nhị = += -= /= %= &= |= ^= <<= >>= hạng == != < > <= >= && || [] () ,  Các phép toán không thể tái định nghĩa: . .* :: ?: sizeof Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 4
  • 5. Chương 8 Tái định nghĩa toán tử (tt)  Bằng hàm thành viên: class Point { public: Point (int x, int y) { Point::x = x; Point::y = y; } Point operator + (Point &p) { return Point(x + p.x,y + p.y); } Point operator - (Point &p) { return Point(x - p.x, y - p.y); } private: int x, y; }; Có 1 tham số (Nếu là toán tử nhị hạng) void main() { Point p1(10,20), p2(10,20); Point p3 = p1 + p2; Point p4 = p1 - p2; Point p5 = p3.operator + (p4); Point p6 = p3.operator – (p4); }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 5
  • 6. Chương 8 Tái định nghĩa toán tử (tt)  Bằng hàm độc lập: thường khai báo friend class Point { public: Point (int x, int y) { Point::x = x; Point::y = y; } friend Point operator + (Point &p, Point &q) {return Point(p.x + q.x,p.y + q.y); } friend Point operator - (Point &p, Point &q) {return Point(p.x - q.x,p.y - q.y); } private: Có 2 tham số int x, y; (Nếu là toán tử nhị hạng) }; void main() { Point p1(10,20), p2(10,20); Point p3 = p1 + p2; Point p4 = p1 - p2; Point p5 =operator + (p3, p4); Point p6 = operator – (p3, p4); }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 6
  • 7. Chương 8 Tái định nghĩa toán tử (tt)  Cải tiến lớp tập hợp (Set): #include <iostream.h> // Định nghĩa các toán tử const maxCard = 100; ………………. enum Bool {false, true}; ………………. class Set { int main (void) public: { Set s1, s2, s3; Set(void) { card = 0; } s1.AddElem(10); s1.AddElem(20); friend Bool operator & (const int, Set&);// thanh vien ? s1.AddElem(30); s1.AddElem(40); friend Bool operator == (Set&, Set&); // bang ? s2.AddElem(30); s2.AddElem(50); friend Bool operator != (Set&, Set&); // khong bang ? s2.AddElem(10); s2.AddElem(60); friend Set operator * (Set&, Set&); // giao friend Set operator + (Set&, Set&); // hop cout << "s1 = "; s1.Print(); //... cout << "s2 = "; s2.Print(); void AddElem(const int elem); if (20 & s1) cout << "20 thuoc s1n"; void Copy (Set &set); cout << "s1 giao s2 = "; (s1 * s2).Print(); void Print (void); cout << "s1 hop s2 = "; (s1 + s2).Print(); private: int elems[maxCard]; if (s1 != s2) cout << "s1 /= s2n"; int card; return 0; }; } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 7
  • 8. Chương 8 Chuyển kiểu  Muốn thực hiện các phép cộng: void main() { Point p1(10,20), p2(30,40), p3, p4, p5; p3 = p1 + p2; p4 = p1 + 5; p5 = 5 + p1; }; Có thể định nghĩa thêm 2 toán tử: class Point { //... friend Point operator + (Point, Point); friend Point operator + (int, Point); friend Point operator + (Point, int); }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 8
  • 9. Chương 8 Chuyển kiểu (tt)  Chuyển đổi kiểu: ngôn ngữ định nghĩa sẵn. void main() { Point p1(10,20), p2(30,40), p3, p4, p5; p3 = p1 + p2; p4 = p1 + 5; // tương đương p1 + Point(5) p5 = 5 + p1; // tương đương Point(5) + p1 } Định nghĩa phép chuyển đổi kiểu class Point { //... Chuyển kiểu Point (int x) { Point::x = Point::y = x; } 5  Point(5) friend Point operator + (Point, Point); }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 9
  • 10. Chương 8 Tái định nghĩa toán tử xuất <<  Định nghĩa hàm toàn cục: ostream& operator << (ostream&, Class&); class Point { void main() { public: Point p1(10,20), p2; Point (int x=0, int y=0) cout<<“Diem P1: “<< p1 << endl; { Point::x = x; Point::y = y; } cout<<“Diem P2: “<< p2 << endl; friend ostream& operator << } (ostream& os, Point& p) { os<< “(“ << p.x << “,” << p.y << “)”; } // ….. private: Kết quả int x, y; trên }; màn hình ? Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 10
  • 11. Chương 8 Tái định nghĩa toán tử nhập >>  Định nghĩa hàm toàn cục: istream& operator >> (istream&, Class&); class Point { void main() { public: Point p1, p2; Point (int x=0, int y=0) cout<<“Nhap thong tin cho P1: n“; { Point::x = x; Point::y = y; } cin>>p1; friend istream& operator >> cout<<“Nhap thong tin cho P2: n“; (istream& is, Point& p) cin>>p2; { cout<<“Nhap x: “; is>>p.x; } cout<<“Nhap y: “; is>>p.y; } // ….. private: int x, y; }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 11
  • 12. Chương 8 Tái định nghĩa toán tử [ ]  Thông thường để xuất ra giá trị của 1 phần tử tại vị trí cho trước trong đối tượng.  Định nghĩa là hàm thành viên. class StringVec { char* StringVec::operator [] (int i) { public: if ( i>=0 && i<used) return elems[i]; StringVec (const int dim); return “”; ~StringVec (); } char* operator [] (int); int add(char* ); void main() { // ……….. StringVec sv1(100); private: sv1.add(“PTPhi”);sv1.add(“BQThai”); char **elems; // cac phan tu sv1.add(“LVLam”); sv1.add(“NCHuy”); int dim; // kich thuoc cua vecto cout<< sv1[2]<<endl; int used; // vi tri hien tai cout<<sv1[0]; }; } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 12
  • 13. Chương 8 Tái định nghĩa toán tử ()  Định nghĩa là hàm thành viên. class Matrix { double& Matrix::operator () public: (const short row, const short col) Matrix (const short rows, const short cols); { ~Matrix (void) {delete elems;} static double dummy = 0.0; double& operator () (const short row, return (row >= 1 && row <= rows const short col); && col >= 1 && col <= cols) ? elems[(row - 1)*cols friend ostream& operator << (ostream&, Matrix&); + (col - 1)] friend Matrix operator + (Matrix&, Matrix&); : dummy; friend Matrix operator - (Matrix&, Matrix&); } friend Matrix operator * (Matrix&, Matrix&); void main() { private: Matrix m(3,2); const short rows; // số hàng m(1,1) = 10; m(1,2) = 20; const short cols; // số cột m(2,1) = 30; m(2,2) = 40; double *elems; // các phần tử m(3,1) = 50; m(3,2) = 60; }; cout<<m<<endl; } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 13
  • 14. Chương 8 Khởi tạo ngầm định  Được định nghĩa sẵn trong ngôn ngữ: VD: Point p1(10,20); Point p2 = p1;  Sẽ gây ra lỗi (kết quả SAI) khi bên trong đối tượng có thành phần dữ liệu là con trỏ. trỏ VD: Matrix m(5,6); Matrix n = m; Lỗi sẽ xảy ra do khởi tạo ngầm bằng cách gán tương ứng từng thành phần. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 14
  • 15. Chương 8 Khởi tạo ngầm định (tt) Khi lớp có thành phần dữ liệu con trỏ, trỏ phải định nghĩa hàm xây dựng sao chép class Point { class Matrix { int x, y; //…. public: Matrix(const Matrix&); Point (int =0; int =0 ); }; // Khong can thiet DN Matrix::Matrix (const Matrix &m) Point (const Point& p) { : rows(m.rows), cols(m.cols) x= p.x; { y = p.y; int n = rows * cols; } elems = new double[n]; // cùng kích thước // ……….. for (register i = 0; i < n; ++i) // sao chép phần tử }; elems[i] = m.elems[i]; // …………… } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 15
  • 16. Chương 8 Gán ngầm định  Được định nghĩa sẵn trong ngôn ngữ:  Gán tương ứng từng thành phần.  Đúng khi đối tượng không có dữ liệu con trỏ. VD: Point p1(10,20); Point p2; p2 = p1;  Khi thành phần dữ liệu có con trỏ, bắt buộc phải định nghĩa phép gán = cho lớp. class Matrix { //…. Hàm Matrix& operator = (const Matrix &m) { thành if (rows == m.rows && cols == m.cols) { // phải khớp viên int n = rows * cols; for (register i = 0; i < n; ++i) // sao chép các phần tử elems[i] = m.elems[i]; } return *this; } }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 16
  • 17. Chương 8 Tái định nghĩa toán tử ++ & --  Toán tử ++ (hoặc toán tử --) có 2 loại:  Tiền tố: ++n  Hậu tố: n++ class PhanSo { void main() { int tuso, mau so; PhanSo p1(3,4), p2; public: // ….. cout<< p1++; PhanSo(int=0 , int =1); cout<<++p2; friend PhanSo operator ++ (PhanSo&); cout<<++(p1++) + (++p2)++; friend PhanSo operator ++ (PhanSo&, int); } }; PhanSo operator ++ (PhanSo& p) { return (p = PhanSo(tuso+mauso, mauso)); } PhanSo operator ++ (PhanSo& p, int x) { Kết quả trên PhanSo p2 = PhanSo(tuso+mauso, mauso); màn hình ? return p2; } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 17
  • 18. Chương 8 Tái định nghĩa new & delete  Hàm new và delete mặc định của ngôn ngữ:  Nếu đối tượng kích thước nhỏ, có thể sẽ gây ra quá nhiều khối nhỏ => chậm.  Không đáng kể khi đối tượng có kích thước lớn. => Toán tử new và delete ít được tái định nghĩa.  Định nghĩa theo dạng hàm thành viên: class Point { void main() { public: Point *p = new Point(10,20); //... Point *ds = new Point[30]; void* operator new (size_t bytes); //……………… void operator delete (void *ptr, size_t bytes); delete p; private: delete []ds; int xVal, yVal; } }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 18