Bài giảng Lập trình hướng đối tượng C++ - Chương 7: Lớp (Class)
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)", để 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_c_chuong_7_lop_class.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)
- 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 n Lớp – Quyền truy xuất n Khai báo, định nghĩa 1 lớp đơn giản n Hàm thành viên nội tuyến (inline) n Hàm xây dựng (constructor) n Hàm hủy (destructor) n Hàm bạn (friend) – Lớp bạn n Đối số mặc định n Đố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) n Toán tử phạm vi n Danh sách khởi tạo thành viên n Thành viên hằng - Thành viên tĩnh n Thành viên tham chiếu n Thành viên là đối tượng của 1 lớp n Mảng các đối tượng n Phạm vi lớp n Cấu trúc (structure) và hợp (union) n 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 n 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 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) { 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 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 n Dùng để định nghĩa và khởi tạo đối tượng cùng 1 lúc. n Có tên trùng với tên lớp, không có kiểu trả về. n Không gọi trực tiếp, sẽ được tự động gọi khi khởi tạo đt. n 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; 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 { 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 n Dọn dẹp 1 đối tượng trước khi nó được thu hồi. n Cú pháp: ~TenLop() { } n Không gọi trực tiếp, sẽ được tự động gọi khi hủy bỏ đt. n 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) n Cách 1: Khai báo hàm thành viên của lớp IntSet là bạnbạn (friendfriend) 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) n Cách 2: ¨ Chuyển hàm SetToReal ra ngoài (độcđộc lậplập). ¨ Khai báo hàm đó là bạnbạ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) n Hàm bạn: ¨ Có quyền truy xuất đến tất cả các dữdữ liệuliệu và hàmhàm thành viên (protected + private) của 1 lớp. ¨ Lý do: n Cách định nghĩa hàm chính xác. n Hàm cài đặt không hiệu quả. n 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 n Đố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 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 n 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. n Câu lệnh: pt.OffsetPt(2,2); pt.Point::OffsetPt(2,2); n 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 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 n 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 n Hằng đối tượng: không được thay đổi giá trị. n 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 n 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 n 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 { 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 n 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 n 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 n 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]; n 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 n 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 n 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 n Lớp toàn cục: đại đa số lớp trong C++. n Lớp lồng nhau: lớp chứa đựng lớp. n 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 n 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 n 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 n Đ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