Bài giảng Lập trình hướng đối tượng C++ - Chương 7: Lớp - Đại học Cần Thơ
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)
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
oint pt; pt.SetPt(10,20); pt.OffsetPt(2,2); .. pt.xVal = 10; // Đúng hay sai? Point pt1, pt2, pt3; . } Gọi hàmtrên đối tượngTạo rađối tượng thuộc lớpPointKhai báo LớpĐịnh nghĩacác hàmthành viên5Khoa Công Nghệ Thông Tin - Đại Học Cần ThơHàm thành viên nội tuyếnHà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.Chương 7 class Point { int xVal, yVal; public: void SetPt (int, int); void OffsetPt (int, int); }; inline void Point::SetPt (int x, int y) { xVal = x; yVal = y; } class Point { int xVal, yVal; public: void SetPt (int x, int y) { xVal = x; yVal = y; } void OffsetPt (int x, int y) { xVal += x; yVal += y; } }; Cách 2:Địnhnghĩa bêntrong lớpCách 1:thêmTừ khóainline6Khoa Công Nghệ Thông Tin - Đại Học Cần ThơVí dụ - Lớp Set (tập hợp)Chương 7 #include const maxCard = 100;enum Bool {false, true};class Set { private: int elems[maxCard]; int card; public: void EmptySet(){ card = 0; } Bool IsMember (const int); void AddElem (const int); void RmvElem (const int); void Copy (Set&); Bool Equal (Set&); void Intersect (Set&, Set&); void Union (Set&, Set&); void Print (); }; Bool Set::IsMember (const int elem) { for (register i = 0; i 0) cout s2\n"; return 0;}Kết quả ?8Khoa Công Nghệ Thông Tin - Đại Học Cần ThơHàm xây dựngChương 7Dù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 { int xVal, yVal; public: Point (int x, int y) { xVal = x; yVal = y; } void OffsetPt (int x, int y) { xVal += x; yVal += y; } }; void main() { Point pt1(10,20); pt1.OffsetPt(2,2); .. // Khai báo nào là sai ? Point pt2; Point pt3(); Point pt4 = Point(5,5); Point pt5 = new Point(5,5); . } 9Khoa Công Nghệ Thông Tin - Đại Học Cần ThơHàm xây dựng (tt)Chương 7 class Point { int xVal, yVal; public: Point () // Hàm xây dựng mặc nhiên { xVal = 0; yVal = 0; } Point (int x, int y) { xVal = x; yVal = y; } Point (float len, float angle) { xVal = (int) (len * cos(angle)); yVal = (int) (len * sin(angle)); } void OffsetPt (int , int ); };void main() { Point p1; Point p2(10,20); Point p3(60.3, 3.14);}class Set { private: int *elems; int maxCard; int card; public: Set(const int size) { elems = new int[size]; maxCard = size; card = 0; } }; void main() { Set s1(100); Set s2(20); Set s3(1000); }MềmdẻohơnKhông cầnphải nhớgọi hàmEmptySet()khi khởi tạo10Khoa Công Nghệ Thông Tin - Đại Học Cần ThơHàm hủyChương 7Dọ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 { private: int *elems; int maxCard; int card; public: Set(const int size) { } ~Set() { delete[] elems; } . }; Set TestFunct1(Set s1) { Set *s = new Set(50); return *s; } void main() { Set s1(40), s2(50); s2 = TestFunct1(s1);} Tổng cộng có bao nhiêu lần hàm hủy được gọi ?11Khoa Công Nghệ Thông Tin - Đại Học Cần ThơBạn (Friend) – Đặt vấn đề class IntSet { public: //... private: int elems[maxCard]; int card;};class RealSet { public: //... private: float elems[maxCard]; int card;};Tập CácSố NguyênTập CácSố Thực void IntSet::SetToReal (RealSet &set) { set.card = card; for (register i = 0; i xVal += x; 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ỏ *this17Khoa Công Nghệ Thông Tin - Đại Học Cần ThơToán tử phạm viToá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; }18Khoa Công Nghệ Thông Tin - Đại Học Cần ThơDanh sách khởi tạo thành viênTương đương việc gán giá trị dữ liệu thành viên.class Image { public: Image(const int w, const int h); private: int width; int height; //... };Image::Image(const int w, const int h) { width = w; height = h; //..................... }Image::Image (const int w, const int h) : width(w), height(h) { //............... } class Point { int xVal, yVal; public: Point (int x, int y) { xVal = x; yVal = y; } // }; Point::Point (int x, int y) : xVal(x), yVal(y) { }19Khoa Công Nghệ Thông Tin - Đại Học Cần ThơThành viên hằngHằng dữ liệu thành viên:class Image { public: Image(const int w, const int h); private: const int width; const int height; //...};Image::Image (const int w, const int h) : width(w), height(h) { //................ }Khai báo bình thườngnhư dữ liệu thành viênclass Image { const int width = 256; const int height = 168; //...};Khởi tạo SAIKhởi tạo ĐÚNG thông qua danh sách khởi tạo thành viên20Khoa Công Nghệ Thông Tin - Đại Học Cần ThơThành viên hằngHằ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 { public: Set(void){ card = 0; } Bool Member(const int) const; void AddElem(const int); //...};Bool Set::Member (const int elem) const { //... }void main() { const Set s; s.AddElem(10); // SAI s.Member(10); // ok }21Khoa Công Nghệ Thông Tin - Đại Học Cần ThơThành viên tĩnhDữ 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; // con trỏ tới window kế tiếp Window *next; //...};Window *Window::first = &myWindow;// .Khởi tạo dữ liệu thành viên tĩnhKhai báo22Khoa Công Nghệ Thông Tin - Đại Học Cần ThơThành viên tĩnhHà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 { // . static void PaintProc () { .. } // };void main() { // . Window::PainProc();}Truy xuất hàm thành viên tĩnhKhai báo Định nghĩa hàm thành viên tĩnh23Khoa Công Nghệ Thông Tin - Đại Học Cần Thơclass Image { int width; int height; int &widthRef = width; //...};Thành viên tham chiếuTham chiếu dữ liệu thành viên:class Image { int width; int height; int &widthRef; //...};Image::Image (const int w, const int h) : widthRef(width){ //... }Khai báo bình thườngnhư dữ liệu thành viênKhởi tạo SAIKhởi tạo ĐÚNG thông qua danh sách khởi tạo thành viên24Khoa Công Nghệ Thông Tin - Đại Học Cần ThơThành viên là đối tượng của 1 lớpDữ 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); //... private: Point topLeft; Point botRight;};Rectangle::Rectangle (int left, int top, int right, int bottom) : topLeft(left,top), botRight(right,bottom){ }Khởi tạo cho các dữ liệu thành viên qua danh sách khởi tạo thành viên25Khoa Công Nghệ Thông Tin - Đại Học Cần ThơMảng các đối tượngSử 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) }; 26Khoa Công Nghệ Thông Tin - Đại Học Cần ThơMảng các đối tượngSử 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ớ đầuclass Polygon { public: //... private: Point *vertices; // các đỉnh int nVertices; // số các đỉnh};Không cần biết kích thước mảng.27Khoa Công Nghệ Thông Tin - Đại Học Cần ThơPhạm vi lớpThà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ốngclass Process { int fork (void); // fork thành viên //...};// int Process::func1 (void){ int x = fork(); // gọi fork cục bộ int pid = ::fork(); // gọi hàm fork hệ thống //...}fork thành viên che đi fork toàn cục trong phạm vi lớp Process28Khoa Công Nghệ Thông Tin - Đại Học Cần ThơPhạm vi lớpLớ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 public: Rectangle (int, int, int, int); //.. private: class Point { public: Point(int a, int b) { } private: int x, y; }; Point topLeft, botRight;};Rectangle::Point pt(1,1); // sd ở ngoàivoid Render (Image &i) { class ColorTable { public: ColorTable () { /* ... */ } AddEntry (int r, int g, int b) { /* ... */ } //... }; ColorTable colors; //... }ColorTable ct; // SAI29Khoa Công Nghệ Thông Tin - Đại Học Cần ThơCấu trúc và hợpCấ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 { Point (int, int); void OffsetPt(int, int); int x, y;};class Point { public: Point(int, int); void OffsetPt(int, int); 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ựng30Khoa Công Nghệ Thông Tin - Đại Học Cần ThơCấu trúc và hợpHợ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 { long integer; double real; char *string; Pair list; //...}; Kích thước của Value là 8 bytes = sizeof(double)class Pair { Value *head; Value *tail; //...};class Object { private: enum ObjType {intObj, realObj, strObj, listObj}; ObjType type; // kiểu đối tượng Value val; // giá trị của đối tượng //...}; 31Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ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, supervisoryPack };enum Bool { false, true }; // Packet p;p.type = controlPack;p.acknowledge = true; 32Khoa Công Nghệ Thông Tin - Đại Học Cần Thơ
File đính kèm:
- Lesson07.ppt