SlideShare a Scribd company logo
1 of 32
CHƯƠNG 7:

                                              LỚP
                                             (CLASS)
           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 7


                                     Nội dung
      Lớp – Quyền truy xuất
      Khai báo, định nghĩa 1 lớp đơn giản
      Hàm thành viên nội tuyến (inline)
      Hàm xây dựng (constructor)
      Hàm hủy (destructor)
      Hàm bạn (friend) – Lớp bạn
      Đối số mặc định
      Đối số thành viên ẩn (con trỏ this)

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


                                Nội dung (tt)
      Toán tử phạm vi
      Danh sách khởi tạo thành viên
      Thành viên hằng - Thành viên tĩnh
      Thành viên tham chiếu
      Thành viên là đối tượng của 1 lớp
      Mảng các đối tượng
      Phạm vi lớp
      Cấu trúc (structure) và hợp (union)
      Các trường bit

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


                             Khái niệm lớp
      Lớp: kiểu dữ liệu trừu tượng.                                          private
                                                                             protected
                                                                               public
  Đặc tả                                     class TÊNLỚP
                       TÊN LỚP
    đối                                          [: <Quyền truy xuất> LỚPCHA ]
  tượng
                                              { <Quyền truy xuất > :
                        Dữ liệu                       DataType1 memberdata1;
                       thành viên                     DataType2 memberdata2;
                                                      …………….
                                                  < Quyền truy xuất > :
  Tập các                 Hàm
  thao tác                                            memberFunction1();
                       thành viên
                                                      memberFunction2();
                                                      …………..
                                              };

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


                               Lớp đơn giản
       Ví dụ:                                                                             Tạo ra
                                                                                         đối tượng
                class Point {                                                            thuộc lớp
                      int xVal, yVal;                   void main() {                       Point
                   public:                                 Point pt;
  Khai báo            void SetPt (int, int);
                      void OffsetPt (int, int);             pt.SetPt(10,20);
  Lớp                                                       pt.OffsetPt(2,2);
                };                                                                      Gọi hàm
                                                            ……..
                void Point::SetPt (int x, int y) {
                     Point                                                                trên
                    xVal = x;                                                           đối tượng
Định nghĩa          yVal = y;
                  }                                         pt.xVal = 10; // Đúng hay sai?
các hàm
thành viên      void Point::OffsetPt (int x, int y) {
                     Point
                    xVal += x;                              Point pt1, pt2, pt3;
                                                            ……….
                    yVal += y;
                }                                       }

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


           Hàm thành viên nội tuyến
        Hàm inline:
             inline
              Cải thiện tốc độ thực thi
              Tốn bộ nhớ (dành cho mã lệnh) khi thực thi.
Cách 1:
     1
              class Point {                                     class Point {
 thêm               int xVal, yVal;                                  int xVal, yVal;
  Từ              public:                               Cách 2: public:
                                                               2
 khóa               void SetPt (int, int);                           void SetPt (int x, int y) {
inline              void OffsetPt (int, int);             Định           xVal = x;
               };                                       nghĩa            yVal = y;
                                                          bên          }
            inline void Point::SetPt (int x, int y) {
                        Point
                                                         trong       void OffsetPt (int x, int y) {
                xVal = x;
                                                           lớp           xVal += x;
                yVal = y;                                                yVal += y;
             }                                                         }
            ……………                                               };
 Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                    6
Chương 7


            Ví dụ - Lớp Set (tập hợp)
  #include <iostream.h>                      Bool Set::IsMember (const int elem) {
                                                for (register i = 0; i < card; ++i)
 const maxCard = 100;
                                                     if (elems[i] == elem)
 enum Bool {false, true};                                  return true;
 class Set {                                    return false;
      private:                               }
           int elems[maxCard];               void Set::AddElem (const int elem) {
           int card;                            if (IsMember(elem))
                                                     return;
      public:                                   if (card < maxCard)
           void EmptySet(){ card = 0; }             elems[card++] = elem;
           Bool IsMember (const int);           else
                                                    cout << "Set overflow“<<endl;
           void AddElem (const int);         }
           void RmvElem (const int);         void Set::RmvElem (const int elem) {
           void Copy (Set&);                    for (register i = 0; i < card; ++i)
           Bool Equal (Set&);                        if (elems[i] == elem) {
                                                           for (; i < card-1; ++i) // Dịch
           void Intersect (Set&, Set&);                         elems[i] = elems[i+1];
           void Union (Set&, Set&);                        --card;
           void Print ();                               }
                                             }
  };

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


                       Ví dụ - Lớp Set (tt)
     void Set::Copy (Set &set) {              ………
        for (register i = 0; i < card; ++i)   int main (void) {
             set.elems[i] = elems[i];              Set s1, s2;
        set.card = card;                           s1.EmptySet(); s2.EmptySet();
     }                                             s1.AddElem(10); s1.AddElem(20);
     Bool Set::Equal (Set &set) {                  s1.AddElem(30); s1.AddElem(40);
        if (card != set.card)
                                                   s2.AddElem(30); s2.AddElem(50);
               return false;
        for (register i = 0; i < card; ++i)        s2.AddElem(10); s2.AddElem(60);
              if (!set.IsMember(elems[i]))         cout << "s1 = "; s1.Print();
                    return false;                  cout << "s2 = "; s2.Print();
        return true;                               s2.RmvElem(50);
     }                                             cout << "s2 - {50} = ";
     void Set::Print (void) {
                                                                                       Kết
                                                   s2.Print();
         cout << "{";                              if (s1.IsMember(20))
                                                                                      quả ?
         for (int i = 0; i < card-1; ++i)                  cout << "20 is in s1n";
               cout << elems[i] << ",";             if (!s1.Equal(s2))
         if (card > 0)
                                                           cout << "s1 <> s2n";
               cout << elems[card-1];
         cout << "}“<<endl;                         return 0;
     }                                        }

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


                            Hàm xây dựng
      Dùng để định nghĩa và khởi tạo đối tượng cùng 1 lúc.
      Có tên trùng với tên lớp, không có kiểu trả về.
      Không gọi trực tiếp, sẽ được tự động gọi khi khởi tạo đt.
      Gán giá trị, cấp vùng nhớ cho các dữ liệu thành viên.
                                                         viên

            class Point {                         void main() {
                 int xVal, yVal;                      Point pt1(10,20);
               public:                                pt1.OffsetPt(2,2);
                 Point (int x, int y) {               ……..
                      xVal = x; yVal = y;           // Khai báo nào là sai ?
                   }                                  Point pt2;
                                                      Point pt3();
                 void OffsetPt (int x, int y) {
                                                      Point pt4 = Point(5,5);
                      xVal += x; yVal += y;
                                                      Point pt5 = new Point(5,5);
                   }
                                                      ……….
             };                                   }

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


                       Hàm xây dựng (tt)
                                                class Set {                                Mềm
  class Point {                                                                            dẻo
                                                     private:
       int xVal, yVal;                                                                     hơn
                                                         int *elems;
     public:                                             int maxCard;
       Point () // Hàm xây dựng mặc nhiên                int card;
         { xVal = 0; yVal = 0; }                     public:
       Point (int x, int y) {                           Set(const int size) {
            xVal = x; yVal = y;                             elems = new int[size];
         }                                                  maxCard = size;
       Point (float len, float angle) {                     card = 0;
             xVal = (int) (len * cos(angle));             }
             yVal = (int) (len * sin(angle));           ……………
          }                                       };
         void OffsetPt (int , int ); …                                               Không cần
                                                void main() {
 };                                                  Set s1(100);
                                                                                      phải nhớ
 void main() {                                       Set s2(20);                       gọi hàm
      Point p1;                                      Set s3(1000); …                 EmptySet()
      Point p2(10,20);                          }                                    khi khởi tạo
      Point p3(60.3, 3.14);
 }
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                  10
Chương 7


                                      Hàm hủy
      Dọn dẹp 1 đối tượng trước khi nó được thu hồi.
      Cú pháp: ~TenLop() { ……... }
      Không gọi trực tiếp, sẽ được tự động gọi khi hủy bỏ đt.
      Thu hồi vùng nhớ cho các dữ liệu thành viên là con trỏ.
                                                            trỏ

          class Set {                         Set TestFunct1(Set s1) {
              private:                            Set *s = new Set(50);
                  int *elems;                     return *s;
                                                                          Tổng cộng
                  int maxCard;                 }
                                                                            có bao
                  int card;
                                              void main() {                nhiêu lần
              public:
                 Set(const int size) { …… }
                                                 Set s1(40), s2(50);       hàm hủy
                                                 s2 = TestFunct1(s1);     được gọi ?
                ~Set() { delete[] elems; }
                                              }
                 ….
           };


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                             11
Bạn (Friend) – Đặt vấn đề
    Tập Các                                                                Hàm SetToReal
   Số Nguyên                                                               dùng để chuyển
                                                                            tập số nguyên
                                                                          thành tập số thực
           class IntSet {
               public:                        void IntSet::SetToReal (RealSet &set) {
                     //...                        set.card = card;
               private:                           for (register i = 0; i < card; ++i)
                     int elems[maxCard];              set.elems[i] = (float) elems[i];
                     int card;               }
          };
        class RealSet {
            public:                                                      Làm thế nào
                  //...                                                  để thực hiện
Tập Các     private:                                                    được việc truy
Số Thực           float elems[maxCard];                                      xuất
                  int card;                                             đến thành viên
        };                                                                Private ?



Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                               12
Hàm bạn (Friend)
      Cách 1: Khai báo hàm thành viên của lớp
       IntSet là bạn (friend) của lớp RealSet.
                      friend
                                              class IntSet {
             Giữ nguyên định                      public:
            nghĩa của lớp IntSet                        //...
                                                  private:
                                                        int elems[maxCard];
                                                        int card;
                                             };
                                             class RealSet {
                                                 public:
         Thêm dòng khai báo                            //...
            Friend cho                                 friend void IntSet::SetToReal (RealSet&);
           hàm thành viên                        private:
             SetToReal                                 float elems[maxCard];
                                                       int card;
                                             };

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                   13
Hàm bạn (Friend)
      Cách 2:
            Chuyển hàm SetToReal ra ngoài (độc lập).
                                                  lập
            Khai báo hàm đó là bạn của cả 2 lớp.
   class IntSet {
       public:                                             void SetToReal (IntSet& iSet,
             //...                                                              RealSet& rSet )
             friend void SetToReal (IntSet &, RealSet&);
       private:                                            {
             int elems[maxCard];                             rSet.card = iSet.card;
             int card;                                       for (int i = 0; i < iSet.card; ++i)
  };                                                           rSet.elems[i] =
  class RealSet {                                                     (float) iSet.elems[i];
       public:
             //...                                         }
             friend void SetToReal (IntSet &, RealSet&);
       private:                                                                 Hàm độc lập
             float elems[maxCard];                                             là bạn(friend)
             int card;
  };                                                                            của cả 2 lớp.

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                  14
Bạn (Friend)
      Hàm bạn:
           bạn
         Có quyền truy xuất đến tất cả các dữ liệu và
         hàm thành viên (protected + private) của 1 lớp.
         Lý do:
               Cách định nghĩa hàm chính xác.
               Hàm cài đặt không hiệu quả.

       Lớp bạn:
            bạn
            Tất cả các hàm trong lớp bạn: là hàm bạn.
               class A;                      class IntSet { ……….. }
               class B { // ……….             class RealSet { // ……….
                   friend class A;               friend class IntSet;
               };                            };

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                              15
Đối số mặc định
      Đối số mặc định tính từ bên phải.
      class Point {                          class Point {
             int xVal, yVal;                        int xVal, yVal;
          public:                                public:
             Point (int x = 0, int y = 0);          Point (int x = 0, int y = 0);
             //...                                  Point (float x=0, float y=0);
      };                                            //...
                                             };                                   Tối nghĩa
      void main() {                                                                Mơ hồ
         Point p1;        // như là ???      void main() {
         Point p2(10); // như là ???            Point p2(1.6, 5.0); // như là ???
         Point p3(10,20);                       Point p3(10,20);         // như là ???
         Point p4(, 20); // ?????               Point p4;                // ?????
        …..                                     …..
      }                                      }

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                16
Đối số thành viên ẩn
      Con trỏ *this:
               *this
            Là 1 thành viên ẩn, có thuộc tính là private.
            Trỏ tới chính bản thân đối tượng.

    void Point::OffsetPt (int x, int y) {
         Point                                    void Point::OffsetPt (int x, int y) {
                                                       Point
             xVal += x;                                    this->xVal += x;
             yVal += y;                                    this->yVal += y;
     }                                              }




                 • Có những trường hợp sử dụng *this là dư thừa (Ví dụ trên)
                 • Tuy nhiên, có những trường hợp phải sử dụng con trỏ *this


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                17
Toán tử phạm vi
      Toán tử :: dùng để xác định chính xác hàm
       (thuộc tính) được truy xuất thuộc lớp nào.
      Câu lệnh:       pt.OffsetPt(2,2);
           <=>         pt.Point::OffsetPt(2,2);
      Cần thiết trong một số trường hợp:
         Cách gọi hàm trong thừa kế.
         Tên thành viên bị che bởi biến cục bộ.
         Ví dụ: Point(int xVal, int yVal) {
                              Point::xVal = xVal;
                              Point::yVal = yVal;
                          }
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ          18
Danh sách khởi tạo thành viên
      Tương đương việc gán giá trị dữ liệu thành viên.

         class Point {                       class Image {
                                                  public:
               int xVal, yVal;
                                                       Image(const int w, const int h);
            public:                               private:
               Point (int x, int y) {                  int width;
                    xVal = x;                          int height;
                    yVal = y;                           //...
                 }                            };
                                             Image::Image(const int w, const int h) {
               // ……………………                             width = w;
         };                                            height = h;
                                                       //.....................
                                              }
        Point::Point (int x, int y)
                : xVal(x), yVal(y)           Image::Image (const int w, const int h)
          { }                                  : width(w), height(h)
                                              { //............... }

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                             19
Thành viên hằng
      Hằng dữ liệu thành viên:
                   class Image {
                        public:
                            Image(const int w, const int h);             Khai báo bình thường
                        private:                                         như dữ liệu thành viên
                             const int width;
                             const int height;
                      //...
                   };

                                             class Image {
                                                      const int width = 256;
             Khởi tạo                                 const int height = 168;
               SAI                              //...
                                             };

                   Image::Image (const int w, const int h)                 Khởi tạo ĐÚNG
                                : width(w), height(h)                   thông qua danh sách
                     { //................ }                              khởi tạo thành viên

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                     20
Thành viên hằng
   Hằng đối tượng: không được thay đổi giá trị.
   Hàm thành viên hằng:
            Được phép gọi trên hằng đối tượng.
            Không được thay đổi giá trị dữ liệu thành viên.
    class Set {                               void main() {
         public:                                 const Set s;
              Set(void){ card = 0; }             s.AddElem(10); // SAI
              Bool Member(const int) const;
              void AddElem(const int);           s.Member(10); // ok
              //...
    };                                        }
    Bool Set::Member (const int elem) const
     {    //...
     }


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                               21
Thành viên tĩnh
      Dữ liệu thành viên tĩnh:
         Dùng chung 1 bản sao chép (1 vùng nhớ) chia sẻ
         cho tất cả đối tượng của lớp đó.
         Sử dụng: <TênLớp>::<TênDữLiệuThànhViên>
         Thường dùng để đếm số lượng đối tượng.

             class Window {
                       // danh sách liên kết tất cả Window
                 static Window *first;                       Khai báo
                       // con trỏ tới window kế tiếp
                        Window *next;
                       //...
             };                                                  Khởi tạo
                                                                  dữ liệu
             Window *Window::first = &myWindow;
                     Window::                                   thành viên
             // …………….                                             tĩnh

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                   22
Thành viên tĩnh
      Hàm thành viên tĩnh:
            Tương đương với hàm toàn cục.
            Gọi thông qua: <TênLớp>::<TênHàm>

             class Window {
                                                          Khai báo
                  // ……….
                                                         Định nghĩa
                  static void PaintProc () { ….. }
                                                         hàm thành
                  // ………
                                                          viên tĩnh
              };

             void main() {
                  // …………….
                  Window::PainProc();
                  Window::                            Truy xuất
                                                     hàm thành
             }                                        viên tĩnh


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                            23
Thành viên tham chiếu
      Tham chiếu dữ liệu thành viên:
                   class Image {
                            int width;                                  Khai báo bình thường
                            int height;                                 như dữ liệu thành viên
                            int &widthRef;
                      //...
                   };

                                      class Image {
                                               int width;
                                               int height;
             Khởi tạo
                                               int &widthRef = width;
               SAI
                                         //...
                                      };

                   Image::Image (const int w, const int h)            Khởi tạo ĐÚNG
                             : widthRef(width)                     thông qua danh sách
                   { //……………... }                                   khởi tạo thành viên

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                24
Thành viên là đối tượng của 1 lớp
      Dữ liệu thành viên có thể có kiểu:
            Dữ liệu (lớp) chuẩn của ngôn ngữ.
            Lớp do người dùng định nghĩa (có thể là chính lớp đó).
         class Point { ……. };
         class Rectangle {
              public:
                    Rectangle (int left, int top, int right, int bottom);
                    //...                                                    Khởi tạo cho các
               private:                                                      dữ liệu thành viên
                    Point topLeft;                                          qua danh sách khởi
                    Point botRight;                                           tạo thành viên
         };
         Rectangle::Rectangle (int left, int top, int right, int bottom)
                    : topLeft(left,top), botRight(right,bottom)
         {}


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                  25
Mảng các đối tượng
      Sử dụng hàm xây dựng không đối số (hàm
       xây dựng mặc nhiên - default constructor).
       VD: Point pentagon[5];
      Sử dụng bộ khởi tạo mảng:
       VD: Point triangle[3] =
              { Point(4,8), Point(10,20), Point(35,15) };
       Ngắn gọn:
           Set s[4] = { 10, 20, 30, 40 };
       tương đương với:
           Set s[4] = { Set(10), Set(20), Set(30), Set(40) };


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                      26
Mảng các đối tượng
      Sử dụng dạng con trỏ:
            Cấp vùng nhớ:
              VD: Point *pentagon = new Point[5];
            Thu hồi vùng nhớ:
                    delete[] pentagon;
                    delete pentagon;   // Thu hồi vùng nhớ đầu

            class Polygon {
                 public:                                      Không cần biết kích
                      //...                                      thước mảng.
                 private:
                      Point *vertices;       // các đỉnh
                      int   nVertices;       // số các đỉnh
            };


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                          27
Phạm vi lớp
      Thành viên trong 1 lớp:
            Che các thực thể trùng tên trong phạm vi.
                 // ………
                 int fork (void);          // fork hệ thống
                 class Process {
                            int fork (void); // fork thành viên       fork thành viên
                            //...                                   che đi fork toàn cục
                 };                                                  trong phạm vi lớp
                                                                          Process
                 // ………
                 int Process::func1 (void)
                 { int x = fork();      // gọi fork cục bộ
                     int pid = ::fork(); // gọi hàm fork hệ thống
                     //...
                 }


Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                            28
Phạm vi lớp
   Lớp toàn cục: đại đa số lớp trong C++.
   Lớp lồng nhau: lớp chứa đựng lớp.
   Lớp cục bộ: trong 1 hàm hoặc 1 khối.
      class Rectangle { // Lớp lồng nhau                void Render (Image &i)
          public:                                         {
                Rectangle (int, int, int, int);             class ColorTable {
                //..                                              public:
          private:                                                    ColorTable () { /* ... */ }
                 class Point {                                        AddEntry (int r, int g, int b)
                     public:                                              { /* ... */ }
                            Point(int a, int b) { … }               //...
                     private:
                            int x, y;                          };
                  };                                        ColorTable colors;
                 Point topLeft, botRight;                   //...
      };                                                 }
      Rectangle::Point pt(1,1); // sd ở ngoài           ColorTable ct; // SAI

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                                             29
Cấu trúc và hợp
      Cấu trúc (structure):
            Bắt nguồn từ ngôn ngữ C.
            Tương đương với class với các thuộc tính là public.
            Sử dụng như class.

        struct Point {                       class Point {
                  Point (int, int);                public:
                                                        Point(int, int);
                  void OffsetPt(int, int);              void OffsetPt(int, int);
                  int x, y;                             int          x, y;
        };                                   };


        Point p = { 10, 20 };                Có thể khởi tạo dạng này
                                             nếu không có định nghĩa
                                                  hàm xây dựng
Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                         30
Cấu trúc và hợp
      Hợp (union):
         Tất cả thành viên ánh xạ đến cùng 1 địa chỉ bên
         trong đối tượng chính nó (không liên tiếp).
         Kích thước = kích thước của dữ liệu lớn nhất.
        union Value {                        class Object {
                 long       integer;             private:
                 double     real;                    enum ObjType {intObj, realObj,
                 char       *string;                                 strObj, listObj};
                 Pair        list;                   ObjType type; // kiểu đối tượng
                 //...                               Value val; // giá trị của đối tượng
        };                                           //...
                                             };
        class Pair {
                  Value        *head;
                  Value        *tail;
                  //...                        Kích thước của Value là
        };                                     8 bytes = sizeof(double)

Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ                                             31
Các trường bit
      Điều khiển đối tượng ở mức bit.
       VD: Truy xuất các bit trong header của gói tin.
    typedef unsigned int Bit;
                           Bit
    class Packet {
              Bit type             : 2; // rộng 2 bit
              Bit acknowledge : 1; // rộng 1 bit
              Bit channel          : 4; // rộng 4 bit
              Bit sequenceNo : 4; // rộng 4 bit
              Bit moreData         : 1; // rộng 1 bit
              //...
    };                                                  // …………
    enum PacketType { dataPack, controlPack,            Packet p;
                         supervisoryPack };             p.type = controlPack;
    enum Bool { false, true };                          p.acknowledge = true;




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

More Related Content

What's hot

Bai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethuaBai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethuaNhuận Lê Văn
 
Phần 8: Mảng hai chiều
Phần 8: Mảng hai chiềuPhần 8: Mảng hai chiều
Phần 8: Mảng hai chiềuHuy Rùa
 
Phần 6: Hàm
Phần 6: HàmPhần 6: Hàm
Phần 6: HàmHuy Rùa
 
Nmlt C08 Mang2 Chieu
Nmlt C08 Mang2 ChieuNmlt C08 Mang2 Chieu
Nmlt C08 Mang2 ChieuCuong
 
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
 
Session 4
Session 4Session 4
Session 4pnanhvn
 
Nmlt C06 Ham
Nmlt C06 HamNmlt C06 Ham
Nmlt C06 HamCuong
 
Jniについて
JniについてJniについて
JniについてChu Chu
 

What's hot (17)

Bai02 java introduction
Bai02 java introductionBai02 java introduction
Bai02 java introduction
 
Bai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethuaBai06 mot sokythuattrongkethua
Bai06 mot sokythuattrongkethua
 
Bai01 oop overview
Bai01 oop overviewBai01 oop overview
Bai01 oop overview
 
Mang1 chieu
Mang1 chieuMang1 chieu
Mang1 chieu
 
Oop 2
Oop 2Oop 2
Oop 2
 
Bai11 ooad bieu_dolop
Bai11 ooad bieu_dolopBai11 ooad bieu_dolop
Bai11 ooad bieu_dolop
 
Bai07 da hinh
Bai07 da hinhBai07 da hinh
Bai07 da hinh
 
Phần 8: Mảng hai chiều
Phần 8: Mảng hai chiềuPhần 8: Mảng hai chiều
Phần 8: Mảng hai chiều
 
Chapter03 function
Chapter03 functionChapter03 function
Chapter03 function
 
Phần 6: Hàm
Phần 6: HàmPhần 6: Hàm
Phần 6: Hàm
 
Kich ban day hoc
Kich ban day hocKich ban day hoc
Kich ban day hoc
 
Nmlt C08 Mang2 Chieu
Nmlt C08 Mang2 ChieuNmlt C08 Mang2 Chieu
Nmlt C08 Mang2 Chieu
 
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
 
Session 4
Session 4Session 4
Session 4
 
Chuong 4
Chuong 4Chuong 4
Chuong 4
 
Nmlt C06 Ham
Nmlt C06 HamNmlt C06 Ham
Nmlt C06 Ham
 
Jniについて
JniについてJniについて
Jniについて
 

Viewers also liked

Augmented Reality IFITTtalk@Manchester
Augmented Reality IFITTtalk@ManchesterAugmented Reality IFITTtalk@Manchester
Augmented Reality IFITTtalk@Manchesteranjaneshbabu
 
Indoor Visitor Tracking
Indoor Visitor Tracking Indoor Visitor Tracking
Indoor Visitor Tracking anjaneshbabu
 
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
 
The future of real estate
The future of real estateThe future of real estate
The future of real estatepsamiam
 

Viewers also liked (6)

Lesson01
Lesson01Lesson01
Lesson01
 
Augmented Reality IFITTtalk@Manchester
Augmented Reality IFITTtalk@ManchesterAugmented Reality IFITTtalk@Manchester
Augmented Reality IFITTtalk@Manchester
 
Indoor Visitor Tracking
Indoor Visitor Tracking Indoor Visitor Tracking
Indoor Visitor Tracking
 
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
 
The future of real estate
The future of real estateThe future of real estate
The future of real estate
 
Lesson08
Lesson08Lesson08
Lesson08
 

Similar to 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_lesson07xcode_esvn
 
Chuong9 lop vadoituong
Chuong9 lop vadoituongChuong9 lop vadoituong
Chuong9 lop vadoituongMinh Ngoc Tran
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08xcode_esvn
 
Bai06interface 130622091935-phpapp02
Bai06interface 130622091935-phpapp02Bai06interface 130622091935-phpapp02
Bai06interface 130622091935-phpapp02Hoàng Hà
 
Bai06interface 130622091935-phpapp02
Bai06interface 130622091935-phpapp02Bai06interface 130622091935-phpapp02
Bai06interface 130622091935-phpapp02Hoàng Hà
 
Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#
Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#
Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#MasterCode.vn
 
Java ease learning(1)
Java ease learning(1)Java ease learning(1)
Java ease learning(1)Nguyen Xuan
 
01 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_101 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_1htpsccbb159
 
Ctdl C01
Ctdl C01Ctdl C01
Ctdl C01giang
 

Similar to Lesson07 (20)

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
 
Chuong5 (2)
Chuong5 (2)Chuong5 (2)
Chuong5 (2)
 
Lesson08
Lesson08Lesson08
Lesson08
 
Lesson09
Lesson09Lesson09
Lesson09
 
Chuong3 c
Chuong3 c Chuong3 c
Chuong3 c
 
c3 mang2 chieu
c3 mang2 chieuc3 mang2 chieu
c3 mang2 chieu
 
Lesson04
Lesson04Lesson04
Lesson04
 
Chuong9 lop vadoituong
Chuong9 lop vadoituongChuong9 lop vadoituong
Chuong9 lop vadoituong
 
Lesson05
Lesson05Lesson05
Lesson05
 
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08Lap trinh huong_doi_tuong_cpp_dhct_lesson08
Lap trinh huong_doi_tuong_cpp_dhct_lesson08
 
Bai06interface 130622091935-phpapp02
Bai06interface 130622091935-phpapp02Bai06interface 130622091935-phpapp02
Bai06interface 130622091935-phpapp02
 
Bai06interface 130622091935-phpapp02
Bai06interface 130622091935-phpapp02Bai06interface 130622091935-phpapp02
Bai06interface 130622091935-phpapp02
 
Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#
Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#
Bài 6 - Interface - Nền tảng lập trình ứng dụng với C#
 
Java ease learning(1)
Java ease learning(1)Java ease learning(1)
Java ease learning(1)
 
01 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_101 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_1
 
01 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_101 ngon ngu_c#_phan_1
01 ngon ngu_c#_phan_1
 
Ctdl C01
Ctdl C01Ctdl C01
Ctdl C01
 
Chapter 6
Chapter 6Chapter 6
Chapter 6
 
344444
344444344444
344444
 

Lesson07

  • 1. CHƯƠNG 7: LỚP (CLASS) 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 7 Nội dung  Lớp – Quyền truy xuất  Khai báo, định nghĩa 1 lớp đơn giản  Hàm thành viên nội tuyến (inline)  Hàm xây dựng (constructor)  Hàm hủy (destructor)  Hàm bạn (friend) – Lớp bạn  Đối số mặc định  Đối số thành viên ẩn (con trỏ this) Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 2
  • 3. Chương 7 Nội dung (tt)  Toán tử phạm vi  Danh sách khởi tạo thành viên  Thành viên hằng - Thành viên tĩnh  Thành viên tham chiếu  Thành viên là đối tượng của 1 lớp  Mảng các đối tượng  Phạm vi lớp  Cấu trúc (structure) và hợp (union)  Các trường bit Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 3
  • 4. Chương 7 Khái niệm lớp  Lớp: kiểu dữ liệu trừu tượng. private protected public Đặc tả class TÊNLỚP TÊN LỚP đối [: <Quyền truy xuất> LỚPCHA ] tượng { <Quyền truy xuất > : Dữ liệu DataType1 memberdata1; thành viên DataType2 memberdata2; ……………. < Quyền truy xuất > : Tập các Hàm thao tác memberFunction1(); thành viên memberFunction2(); ………….. }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 4
  • 5. Chương 7 Lớp đơn giản  Ví dụ: Tạo ra đối tượng class Point { thuộc lớp int xVal, yVal; void main() { Point public: Point pt; Khai báo void SetPt (int, int); void OffsetPt (int, int); pt.SetPt(10,20); Lớp pt.OffsetPt(2,2); }; Gọi hàm …….. void Point::SetPt (int x, int y) { Point trên xVal = x; đối tượng Định nghĩa yVal = y; } pt.xVal = 10; // Đúng hay sai? các hàm thành viên void Point::OffsetPt (int x, int y) { Point xVal += x; Point pt1, pt2, pt3; ………. yVal += y; } } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 5
  • 6. Chương 7 Hàm thành viên nội tuyến  Hàm inline: inline  Cải thiện tốc độ thực thi  Tốn bộ nhớ (dành cho mã lệnh) khi thực thi. Cách 1: 1 class Point { class Point { thêm int xVal, yVal; int xVal, yVal; Từ public: Cách 2: public: 2 khóa void SetPt (int, int); void SetPt (int x, int y) { inline void OffsetPt (int, int); Định xVal = x; }; nghĩa yVal = y; bên } inline void Point::SetPt (int x, int y) { Point trong void OffsetPt (int x, int y) { xVal = x; lớp xVal += x; yVal = y; yVal += y; } } …………… }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 6
  • 7. Chương 7 Ví dụ - Lớp Set (tập hợp) #include <iostream.h> Bool Set::IsMember (const int elem) { for (register i = 0; i < card; ++i) const maxCard = 100; if (elems[i] == elem) enum Bool {false, true}; return true; class Set { return false; private: } int elems[maxCard]; void Set::AddElem (const int elem) { int card; if (IsMember(elem)) return; public: if (card < maxCard) void EmptySet(){ card = 0; } elems[card++] = elem; Bool IsMember (const int); else cout << "Set overflow“<<endl; void AddElem (const int); } void RmvElem (const int); void Set::RmvElem (const int elem) { void Copy (Set&); for (register i = 0; i < card; ++i) Bool Equal (Set&); if (elems[i] == elem) { for (; i < card-1; ++i) // Dịch void Intersect (Set&, Set&); elems[i] = elems[i+1]; void Union (Set&, Set&); --card; void Print (); } } }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 7
  • 8. Chương 7 Ví dụ - Lớp Set (tt) void Set::Copy (Set &set) { ……… for (register i = 0; i < card; ++i) int main (void) { set.elems[i] = elems[i]; Set s1, s2; set.card = card; s1.EmptySet(); s2.EmptySet(); } s1.AddElem(10); s1.AddElem(20); Bool Set::Equal (Set &set) { s1.AddElem(30); s1.AddElem(40); if (card != set.card) s2.AddElem(30); s2.AddElem(50); return false; for (register i = 0; i < card; ++i) s2.AddElem(10); s2.AddElem(60); if (!set.IsMember(elems[i])) cout << "s1 = "; s1.Print(); return false; cout << "s2 = "; s2.Print(); return true; s2.RmvElem(50); } cout << "s2 - {50} = "; void Set::Print (void) { Kết s2.Print(); cout << "{"; if (s1.IsMember(20)) quả ? for (int i = 0; i < card-1; ++i) cout << "20 is in s1n"; cout << elems[i] << ","; if (!s1.Equal(s2)) if (card > 0) cout << "s1 <> s2n"; cout << elems[card-1]; cout << "}“<<endl; return 0; } } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 8
  • 9. Chương 7 Hàm xây dựng  Dùng để định nghĩa và khởi tạo đối tượng cùng 1 lúc.  Có tên trùng với tên lớp, không có kiểu trả về.  Không gọi trực tiếp, sẽ được tự động gọi khi khởi tạo đt.  Gán giá trị, cấp vùng nhớ cho các dữ liệu thành viên. viên class Point { void main() { int xVal, yVal; Point pt1(10,20); public: pt1.OffsetPt(2,2); Point (int x, int y) { …….. xVal = x; yVal = y; // Khai báo nào là sai ? } Point pt2; Point pt3(); void OffsetPt (int x, int y) { Point pt4 = Point(5,5); xVal += x; yVal += y; Point pt5 = new Point(5,5); } ………. }; } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 9
  • 10. Chương 7 Hàm xây dựng (tt) class Set { Mềm class Point { dẻo private: int xVal, yVal; hơn int *elems; public: int maxCard; Point () // Hàm xây dựng mặc nhiên int card; { xVal = 0; yVal = 0; } public: Point (int x, int y) { Set(const int size) { xVal = x; yVal = y; elems = new int[size]; } maxCard = size; Point (float len, float angle) { card = 0; xVal = (int) (len * cos(angle)); } yVal = (int) (len * sin(angle)); …………… } }; void OffsetPt (int , int ); … Không cần void main() { }; Set s1(100); phải nhớ void main() { Set s2(20); gọi hàm Point p1; Set s3(1000); … EmptySet() Point p2(10,20); } khi khởi tạo Point p3(60.3, 3.14); } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 10
  • 11. Chương 7 Hàm hủy  Dọn dẹp 1 đối tượng trước khi nó được thu hồi.  Cú pháp: ~TenLop() { ……... }  Không gọi trực tiếp, sẽ được tự động gọi khi hủy bỏ đt.  Thu hồi vùng nhớ cho các dữ liệu thành viên là con trỏ. trỏ class Set { Set TestFunct1(Set s1) { private: Set *s = new Set(50); int *elems; return *s; Tổng cộng int maxCard; } có bao int card; void main() { nhiêu lần public: Set(const int size) { …… } Set s1(40), s2(50); hàm hủy s2 = TestFunct1(s1); được gọi ? ~Set() { delete[] elems; } } …. }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 11
  • 12. Bạn (Friend) – Đặt vấn đề Tập Các Hàm SetToReal Số Nguyên dùng để chuyển tập số nguyên thành tập số thực class IntSet { public: void IntSet::SetToReal (RealSet &set) { //... set.card = card; private: for (register i = 0; i < card; ++i) int elems[maxCard]; set.elems[i] = (float) elems[i]; int card; } }; class RealSet { public: Làm thế nào //... để thực hiện Tập Các private: được việc truy Số Thực float elems[maxCard]; xuất int card; đến thành viên }; Private ? Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 12
  • 13. Hàm bạn (Friend)  Cách 1: Khai báo hàm thành viên của lớp IntSet là bạn (friend) của lớp RealSet. friend class IntSet { Giữ nguyên định public: nghĩa của lớp IntSet //... private: int elems[maxCard]; int card; }; class RealSet { public: Thêm dòng khai báo //... Friend cho friend void IntSet::SetToReal (RealSet&); hàm thành viên private: SetToReal float elems[maxCard]; int card; }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 13
  • 14. Hàm bạn (Friend)  Cách 2:  Chuyển hàm SetToReal ra ngoài (độc lập). lập  Khai báo hàm đó là bạn của cả 2 lớp. class IntSet { public: void SetToReal (IntSet& iSet, //... RealSet& rSet ) friend void SetToReal (IntSet &, RealSet&); private: { int elems[maxCard]; rSet.card = iSet.card; int card; for (int i = 0; i < iSet.card; ++i) }; rSet.elems[i] = class RealSet { (float) iSet.elems[i]; public: //... } friend void SetToReal (IntSet &, RealSet&); private: Hàm độc lập float elems[maxCard]; là bạn(friend) int card; }; của cả 2 lớp. Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 14
  • 15. Bạn (Friend)  Hàm bạn: bạn  Có quyền truy xuất đến tất cả các dữ liệu và hàm thành viên (protected + private) của 1 lớp.  Lý do:  Cách định nghĩa hàm chính xác.  Hàm cài đặt không hiệu quả.  Lớp bạn: bạn  Tất cả các hàm trong lớp bạn: là hàm bạn. class A; class IntSet { ……….. } class B { // ………. class RealSet { // ………. friend class A; friend class IntSet; }; }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 15
  • 16. Đối số mặc định  Đối số mặc định tính từ bên phải. class Point { class Point { int xVal, yVal; int xVal, yVal; public: public: Point (int x = 0, int y = 0); Point (int x = 0, int y = 0); //... Point (float x=0, float y=0); }; //... }; Tối nghĩa void main() { Mơ hồ Point p1; // như là ??? void main() { Point p2(10); // như là ??? Point p2(1.6, 5.0); // như là ??? Point p3(10,20); Point p3(10,20); // như là ??? Point p4(, 20); // ????? Point p4; // ????? ….. ….. } } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 16
  • 17. Đối số thành viên ẩn  Con trỏ *this: *this  Là 1 thành viên ẩn, có thuộc tính là private.  Trỏ tới chính bản thân đối tượng. void Point::OffsetPt (int x, int y) { Point void Point::OffsetPt (int x, int y) { Point xVal += x; this->xVal += x; yVal += y; this->yVal += y; } } • Có những trường hợp sử dụng *this là dư thừa (Ví dụ trên) • Tuy nhiên, có những trường hợp phải sử dụng con trỏ *this Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 17
  • 18. Toán tử phạm vi  Toán tử :: dùng để xác định chính xác hàm (thuộc tính) được truy xuất thuộc lớp nào.  Câu lệnh: pt.OffsetPt(2,2); <=> pt.Point::OffsetPt(2,2);  Cần thiết trong một số trường hợp:  Cách gọi hàm trong thừa kế.  Tên thành viên bị che bởi biến cục bộ. Ví dụ: Point(int xVal, int yVal) { Point::xVal = xVal; Point::yVal = yVal; } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 18
  • 19. Danh sách khởi tạo thành viên  Tương đương việc gán giá trị dữ liệu thành viên. class Point { class Image { public: int xVal, yVal; Image(const int w, const int h); public: private: Point (int x, int y) { int width; xVal = x; int height; yVal = y; //... } }; Image::Image(const int w, const int h) { // …………………… width = w; }; height = h; //..................... } Point::Point (int x, int y) : xVal(x), yVal(y) Image::Image (const int w, const int h) { } : width(w), height(h) { //............... } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 19
  • 20. Thành viên hằng  Hằng dữ liệu thành viên: class Image { public: Image(const int w, const int h); Khai báo bình thường private: như dữ liệu thành viên const int width; const int height; //... }; class Image { const int width = 256; Khởi tạo const int height = 168; SAI //... }; Image::Image (const int w, const int h) Khởi tạo ĐÚNG : width(w), height(h) thông qua danh sách { //................ } khởi tạo thành viên Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 20
  • 21. Thành viên hằng  Hằng đối tượng: không được thay đổi giá trị.  Hàm thành viên hằng:  Được phép gọi trên hằng đối tượng.  Không được thay đổi giá trị dữ liệu thành viên. class Set { void main() { public: const Set s; Set(void){ card = 0; } s.AddElem(10); // SAI Bool Member(const int) const; void AddElem(const int); s.Member(10); // ok //... }; } Bool Set::Member (const int elem) const { //... } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 21
  • 22. Thành viên tĩnh  Dữ liệu thành viên tĩnh:  Dùng chung 1 bản sao chép (1 vùng nhớ) chia sẻ cho tất cả đối tượng của lớp đó.  Sử dụng: <TênLớp>::<TênDữLiệuThànhViên>  Thường dùng để đếm số lượng đối tượng. class Window { // danh sách liên kết tất cả Window static Window *first; Khai báo // con trỏ tới window kế tiếp Window *next; //... }; Khởi tạo dữ liệu Window *Window::first = &myWindow; Window:: thành viên // ……………. tĩnh Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 22
  • 23. Thành viên tĩnh  Hàm thành viên tĩnh:  Tương đương với hàm toàn cục.  Gọi thông qua: <TênLớp>::<TênHàm> class Window { Khai báo // ………. Định nghĩa static void PaintProc () { ….. } hàm thành // ……… viên tĩnh }; void main() { // ……………. Window::PainProc(); Window:: Truy xuất hàm thành } viên tĩnh Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 23
  • 24. Thành viên tham chiếu  Tham chiếu dữ liệu thành viên: class Image { int width; Khai báo bình thường int height; như dữ liệu thành viên int &widthRef; //... }; class Image { int width; int height; Khởi tạo int &widthRef = width; SAI //... }; Image::Image (const int w, const int h) Khởi tạo ĐÚNG : widthRef(width) thông qua danh sách { //……………... } khởi tạo thành viên Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 24
  • 25. Thành viên là đối tượng của 1 lớp  Dữ liệu thành viên có thể có kiểu:  Dữ liệu (lớp) chuẩn của ngôn ngữ.  Lớp do người dùng định nghĩa (có thể là chính lớp đó). class Point { ……. }; class Rectangle { public: Rectangle (int left, int top, int right, int bottom); //... Khởi tạo cho các private: dữ liệu thành viên Point topLeft; qua danh sách khởi Point botRight; tạo thành viên }; Rectangle::Rectangle (int left, int top, int right, int bottom) : topLeft(left,top), botRight(right,bottom) {} Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 25
  • 26. Mảng các đối tượng  Sử dụng hàm xây dựng không đối số (hàm xây dựng mặc nhiên - default constructor). VD: Point pentagon[5];  Sử dụng bộ khởi tạo mảng: VD: Point triangle[3] = { Point(4,8), Point(10,20), Point(35,15) }; Ngắn gọn: Set s[4] = { 10, 20, 30, 40 }; tương đương với: Set s[4] = { Set(10), Set(20), Set(30), Set(40) }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 26
  • 27. Mảng các đối tượng  Sử dụng dạng con trỏ:  Cấp vùng nhớ: VD: Point *pentagon = new Point[5];  Thu hồi vùng nhớ: delete[] pentagon; delete pentagon; // Thu hồi vùng nhớ đầu class Polygon { public: Không cần biết kích //... thước mảng. private: Point *vertices; // các đỉnh int nVertices; // số các đỉnh }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 27
  • 28. Phạm vi lớp  Thành viên trong 1 lớp:  Che các thực thể trùng tên trong phạm vi. // ……… int fork (void); // fork hệ thống class Process { int fork (void); // fork thành viên fork thành viên //... che đi fork toàn cục }; trong phạm vi lớp Process // ……… int Process::func1 (void) { int x = fork(); // gọi fork cục bộ int pid = ::fork(); // gọi hàm fork hệ thống //... } Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 28
  • 29. Phạm vi lớp  Lớp toàn cục: đại đa số lớp trong C++.  Lớp lồng nhau: lớp chứa đựng lớp.  Lớp cục bộ: trong 1 hàm hoặc 1 khối. class Rectangle { // Lớp lồng nhau void Render (Image &i) public: { Rectangle (int, int, int, int); class ColorTable { //.. public: private: ColorTable () { /* ... */ } class Point { AddEntry (int r, int g, int b) public: { /* ... */ } Point(int a, int b) { … } //... private: int x, y; }; }; ColorTable colors; Point topLeft, botRight; //... }; } Rectangle::Point pt(1,1); // sd ở ngoài ColorTable ct; // SAI Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 29
  • 30. Cấu trúc và hợp  Cấu trúc (structure):  Bắt nguồn từ ngôn ngữ C.  Tương đương với class với các thuộc tính là public.  Sử dụng như class. struct Point { class Point { Point (int, int); public: Point(int, int); void OffsetPt(int, int); void OffsetPt(int, int); int x, y; int x, y; }; }; Point p = { 10, 20 }; Có thể khởi tạo dạng này nếu không có định nghĩa hàm xây dựng Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 30
  • 31. Cấu trúc và hợp  Hợp (union):  Tất cả thành viên ánh xạ đến cùng 1 địa chỉ bên trong đối tượng chính nó (không liên tiếp).  Kích thước = kích thước của dữ liệu lớn nhất. union Value { class Object { long integer; private: double real; enum ObjType {intObj, realObj, char *string; strObj, listObj}; Pair list; ObjType type; // kiểu đối tượng //... Value val; // giá trị của đối tượng }; //... }; class Pair { Value *head; Value *tail; //... Kích thước của Value là }; 8 bytes = sizeof(double) Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 31
  • 32. Các trường bit  Điều khiển đối tượng ở mức bit. VD: Truy xuất các bit trong header của gói tin. typedef unsigned int Bit; Bit class Packet { Bit type : 2; // rộng 2 bit Bit acknowledge : 1; // rộng 1 bit Bit channel : 4; // rộng 4 bit Bit sequenceNo : 4; // rộng 4 bit Bit moreData : 1; // rộng 1 bit //... }; // ………… enum PacketType { dataPack, controlPack, Packet p; supervisoryPack }; p.type = controlPack; enum Bool { false, true }; p.acknowledge = true; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 32