Bài giảng Lập trình hướng đối tượng C++ - Chương 7: Lớp (Class) - Đại học Cần Thơ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng C++ - Chương 7: Lớp (Class) - Đại học Cần Thơ", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_lap_trinh_huong_doi_tuong_chuong_7_lop_class_dai_h.ppt
Nội dung text: Bài giảng Lập trình hướng đối tượng C++ - Chương 7: Lớp (Class) - Đại học Cần Thơ
- 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 class TÊNLỚP Đặc tả TÊN LỚP đối [: LỚPCHA ] tượng { : Dữ liệu DataType1 memberdata1; thành viên DataType2 memberdata2; . : Tập các Hàm memberFunction1(); thao tác 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); pt.SetPt(10,20); Lớp void OffsetPt (int, int); }; pt.OffsetPt(2,2); Gọi hàm void Point::SetPt (int x, int y) { 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) { 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: 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) { 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 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 << "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 (); } }; } 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 0) cout s2\n"; cout << elems[card-1]; return 0; cout << "}“<<endl; } } 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. 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; void OffsetPt (int x, int y) { Point pt3(); 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) Mềm class Point { class Set { private: dẻo int xVal, yVal; int *elems; hơn 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)); } }; Không cần void OffsetPt (int , int ); 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); } 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ỏ. 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 s1(40), s2(50); hàm hủy Set(const int size) { } s2 = TestFunct1(s1); ~Set() { delete[] elems; } được gọi ? } . }; 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. 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). 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: 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; }; }; 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: 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) { void Point::OffsetPt (int 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
- 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 { 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) { // } 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; s.Member(10); // ok void AddElem(const int); // }; } 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: :: 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; 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: :: class Window { Khai báo // . Định nghĩa static void PaintProc () { } hàm thành // viên tĩnh }; void main() { // . Window::PainProc(); 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; 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