SlideShare ist ein Scribd-Unternehmen logo
1 von 31
Downloaden Sie, um offline zu lesen
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)

                                      1
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

                                      2
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();
                                 …………..
                         };

                                                              3
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;
các hàm        }                                         pt.xVal = 10; // Đúng hay sai?
thành viên   void Point::OffsetPt (int x, int y) {
                  Point
                 xVal += x;                              Point pt1, pt2, pt3;
                                                         ……….
                 yVal += y;
             }
                                                     }

                                                                                            4
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:
           class Point {                                     class Point {
 thêm            int xVal, yVal;                                  int xVal, yVal;
  Từ           public:                                Cách 2: public:
 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;
           }                                                        }
          ……………                                               };
                                                                                            5
Ví dụ - Lớp Set (tập hợp)
 #include <iostream.h>                   Bool Set::IsMember (const int elem) {
const maxCard = 100;                        for (register i = 0; i < card; ++i)
                                                 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
          void AddElem (const int);             cout << quot;Set overflow“<<endl;
                                         }
          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 ();                            }
 };                                      }

                                                                                         6
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;
                                             s2.AddElem(10); s2.AddElem(60);
   for (register i = 0; i < card; ++i)
         if (!set.IsMember(elems[i]))        cout << quot;s1 = quot;; s1.Print();
               return false;                 cout << quot;s2 = quot;; s2.Print();
   return true;                              s2.RmvElem(50);
}                                            cout << quot;s2 - {50} = quot;;
                                                                                  K ết
void Set::Print (void) {                     s2.Print();
    cout << quot;{quot;;                                                                 quả ?
                                             if (s1.IsMember(20))
    for (int i = 0; i < card-1; ++i)                  cout << quot;20 is in s1nquot;;
          cout << elems[i] << quot;,quot;;            if (!s1.Equal(s2))
    if (card > 0)
                                                      cout << quot;s1 <> s2nquot;;
          cout << elems[card-1];
                                              return 0;
    cout << quot;}“<<endl;
                                         }
}
                                                                                         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);
          }
                                              ……….
   };                                     }

                                                                            8
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() {
};                                                                                   phải nhớ
                                                    Set s1(100);
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);
}
                                                                                            9
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ỏ.

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


                                                                          10
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 được
Tập Các     private:                                                  việc truy xuất
Số Thực           float elems[maxCard];                              đến thành viên
                  int card;                                             Private ?
        };



                                                                                      11
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;
                          };
                                                                          12
Hàm bạn (Friend)
   Cách 2:
         Chuyển hàm SetToReal ra ngoài (độc 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.
};
                                                                                          13
Bạn (Friend)
Hàm 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:
  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;
  };                    };

                                                   14
Đố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;                // ?????
  …..                                     …..
}                                      }

                                                                                   15
Đố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


                                                                                    16
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;
          }
                                             17
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 {
       int xVal, yVal;               public:
                                          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)
                                 { //............... }

                                                                          18
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

                                                                              19
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;
                                             s.Member(10); // ok
          void AddElem(const int);
          //...
};                                        }
Bool Set::Member (const int elem) const
 {    //...
 }

                                                                     20
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
                                                      thành viên
   Window *Window::first = &myWindow;
           Window::
                                                         tĩnh
   // …………….
                                                                   21
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


                                                           22
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

                                                                            23
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
            Point botRight;                                         khởi tạo thành viên
 };
 Rectangle::Rectangle (int left, int top, int right, int bottom)
            : topLeft(left,top), botRight(right,bottom)
 {}


                                                                                    24
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) };


                                                         25
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
 };


                                                                  26
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
         //...
    }

                                                                          27
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

                                                                                                28
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
                                                                           29
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)
                                                                       30
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;




                                                                            31

Weitere ähnliche Inhalte

Was ist angesagt?

Уламжлал
УламжлалУламжлал
УламжлалBattur
 
Олон хувьсагчтай функцийн үндэс
Олон хувьсагчтай функцийн үндэсОлон хувьсагчтай функцийн үндэс
Олон хувьсагчтай функцийн үндэсBattur
 
Олон хувьсагчтай функцийн экстремум
Олон хувьсагчтай функцийн экстремумОлон хувьсагчтай функцийн экстремум
Олон хувьсагчтай функцийн экстремумBattur
 
Тодорхой интеграл
Тодорхой интегралТодорхой интеграл
Тодорхой интегралBattur
 
Хязгаарыг бодох
Хязгаарыг бодохХязгаарыг бодох
Хязгаарыг бодохBattur
 
Đề thi Kỹ thuật lập trình có lời giải
Đề thi Kỹ thuật lập trình có lời giảiĐề thi Kỹ thuật lập trình có lời giải
Đề thi Kỹ thuật lập trình có lời giảinataliej4
 

Was ist angesagt? (8)

es6.concurrency()
es6.concurrency()es6.concurrency()
es6.concurrency()
 
Уламжлал
УламжлалУламжлал
Уламжлал
 
Олон хувьсагчтай функцийн үндэс
Олон хувьсагчтай функцийн үндэсОлон хувьсагчтай функцийн үндэс
Олон хувьсагчтай функцийн үндэс
 
Олон хувьсагчтай функцийн экстремум
Олон хувьсагчтай функцийн экстремумОлон хувьсагчтай функцийн экстремум
Олон хувьсагчтай функцийн экстремум
 
Тодорхой интеграл
Тодорхой интегралТодорхой интеграл
Тодорхой интеграл
 
Хязгаарыг бодох
Хязгаарыг бодохХязгаарыг бодох
Хязгаарыг бодох
 
Đề thi Kỹ thuật lập trình có lời giải
Đề thi Kỹ thuật lập trình có lời giảiĐề thi Kỹ thuật lập trình có lời giải
Đề thi Kỹ thuật lập trình có lời giải
 
PhD exam
PhD examPhD exam
PhD exam
 

Mehr von nbb3i

Bai Giang 11
Bai Giang 11Bai Giang 11
Bai Giang 11nbb3i
 
Bai Giang 9
Bai Giang 9Bai Giang 9
Bai Giang 9nbb3i
 
Bai Giang 7
Bai Giang 7Bai Giang 7
Bai Giang 7nbb3i
 
Bai Giang 1
Bai Giang 1Bai Giang 1
Bai Giang 1nbb3i
 
Bai Giang 2
Bai Giang 2Bai Giang 2
Bai Giang 2nbb3i
 
Bai Giang 4
Bai Giang 4Bai Giang 4
Bai Giang 4nbb3i
 
Bai Giang 3
Bai Giang 3Bai Giang 3
Bai Giang 3nbb3i
 
Bai Giang 5
Bai Giang 5Bai Giang 5
Bai Giang 5nbb3i
 
Bai Giang 6
Bai Giang 6Bai Giang 6
Bai Giang 6nbb3i
 
Bai Giang 8
Bai Giang 8Bai Giang 8
Bai Giang 8nbb3i
 
Bai Giang 12
Bai Giang 12Bai Giang 12
Bai Giang 12nbb3i
 

Mehr von nbb3i (11)

Bai Giang 11
Bai Giang 11Bai Giang 11
Bai Giang 11
 
Bai Giang 9
Bai Giang 9Bai Giang 9
Bai Giang 9
 
Bai Giang 7
Bai Giang 7Bai Giang 7
Bai Giang 7
 
Bai Giang 1
Bai Giang 1Bai Giang 1
Bai Giang 1
 
Bai Giang 2
Bai Giang 2Bai Giang 2
Bai Giang 2
 
Bai Giang 4
Bai Giang 4Bai Giang 4
Bai Giang 4
 
Bai Giang 3
Bai Giang 3Bai Giang 3
Bai Giang 3
 
Bai Giang 5
Bai Giang 5Bai Giang 5
Bai Giang 5
 
Bai Giang 6
Bai Giang 6Bai Giang 6
Bai Giang 6
 
Bai Giang 8
Bai Giang 8Bai Giang 8
Bai Giang 8
 
Bai Giang 12
Bai Giang 12Bai Giang 12
Bai Giang 12
 

Bai Giang 10

  • 1. 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) 1
  • 2. 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 2
  • 3. 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(); ………….. }; 3
  • 4. 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; các hàm } pt.xVal = 10; // Đúng hay sai? thành viên void Point::OffsetPt (int x, int y) { Point xVal += x; Point pt1, pt2, pt3; ………. yVal += y; } } 4
  • 5. 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: class Point { class Point { thêm int xVal, yVal; int xVal, yVal; Từ public: Cách 2: public: 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; } } …………… }; 5
  • 6. Ví dụ - Lớp Set (tập hợp) #include <iostream.h> Bool Set::IsMember (const int elem) { const maxCard = 100; for (register i = 0; i < card; ++i) 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 void AddElem (const int); cout << quot;Set overflow“<<endl; } 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 (); } }; } 6
  • 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; s2.AddElem(10); s2.AddElem(60); for (register i = 0; i < card; ++i) if (!set.IsMember(elems[i])) cout << quot;s1 = quot;; s1.Print(); return false; cout << quot;s2 = quot;; s2.Print(); return true; s2.RmvElem(50); } cout << quot;s2 - {50} = quot;; K ết void Set::Print (void) { s2.Print(); cout << quot;{quot;; quả ? if (s1.IsMember(20)) for (int i = 0; i < card-1; ++i) cout << quot;20 is in s1nquot;; cout << elems[i] << quot;,quot;; if (!s1.Equal(s2)) if (card > 0) cout << quot;s1 <> s2nquot;; cout << elems[card-1]; return 0; cout << quot;}“<<endl; } } 7
  • 8. 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); } ………. }; } 8
  • 9. 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() { }; phải nhớ Set s1(100); 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); } 9
  • 10. 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ỏ. class Set { Set TestFunct1(Set s1) { private: Set *s = new Set(50); int *elems; return *s; Tổng cộng int maxCard; } có bao nhiêu int card; lần hàm hủy void main() { public: được gọi ? Set s1(40), s2(50); Set(const int size) { …… } s2 = TestFunct1(s1); ~Set() { delete[] elems; } } …. }; 10
  • 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 được Tập Các private: việc truy xuất Số Thực float elems[maxCard]; đến thành viên int card; Private ? }; 11
  • 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; }; 12
  • 13. Hàm bạn (Friend) Cách 2: Chuyển hàm SetToReal ra ngoài (độc 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. }; 13
  • 14. Bạn (Friend) Hàm 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: 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; }; }; 14
  • 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; // ????? ….. ….. } } 15
  • 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 16
  • 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; } 17
  • 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 { int xVal, yVal; public: 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) { //............... } 18
  • 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 19
  • 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; s.Member(10); // ok void AddElem(const int); //... }; } Bool Set::Member (const int elem) const { //... } 20
  • 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 thành viên Window *Window::first = &myWindow; Window:: tĩnh // ……………. 21
  • 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 22
  • 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 23
  • 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 Point botRight; khởi tạo thành viên }; Rectangle::Rectangle (int left, int top, int right, int bottom) : topLeft(left,top), botRight(right,bottom) {} 24
  • 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) }; 25
  • 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 }; 26
  • 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 //... } 27
  • 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 28
  • 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 29
  • 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) 30
  • 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; 31