Lesson07

821 views
749 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
821
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lesson07

  1. 1. CHƯƠNG 7: LỚP (CLASS)Bộ môn Hệ Thống Máy Tính và Truyền ThôngKhoa 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. 2. Chương 7Nộ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. 3. Chương 7Nộ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. 4. Chương 7Khái niệm lớp private Lớp: kiểu dữ liệu trừu protected tượng. class TÊNLỚP public TÊN LỚPĐặc tả [: <Quyền truy xuất> LỚPCHA ] đối { <Quyền truy xuất > :tượng Dữ liệu DataType1 memberdata1; thành viên DataType2 memberdata2; ……………. < Quyền truy xuất > :Tập các Hàmthao tác memberFunction1(); thành viên memberFunction2(); ………….. }; Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ 4
  5. 5. Chương 7 Lớp đơn giản Ví Tạo ra đối tượng dụ: 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àmthà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. 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) khiCách 1: 1 thực Point { class thi. 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. 7. Chương 7Ví 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. 8. Chương 7Ví 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. 9. Chương 7Hà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. 10. Chương 7Hàm xây dựng (tt) class Set { Mềmclass 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. 11. Chương 7Hà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. 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ệnTập Các private: được việc truySố 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. 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. 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. 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. 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. 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. void Point::tới chính int y) { thân đối tượng. Point OffsetPt (int x, bản Trỏ void Point::OffsetPt (int Point x, int y) { 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. 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. 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. Point { class 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. 20. Thành viên hằng Hằng dữ liệu thành class Image { viên: 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. struct Point { như class. Sử dụng 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. 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. 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. Packet { int Bit; typedef unsigned class Bit 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

×