Chương này giới thiệu cấu trúc lớp C++ để định nghĩa các kiểu dữ liệu mới.Một kiểu dữ liệu mới gồm hai thành phần như sau: Đặc tả cụ thể cho các đối tượng của kiểu, tập các thao tác để thực thi các đối tượng. Mời các bạn cùng tham khảo.
Chương Lớp Chương giới thiệu cấu trúc lớp C++ để định nghĩa kiểu liệu Một kiểu liệu gồm hai thành phần sau: • Đặc tả cụ thể cho đối tượng kiểu • Tập thao tác để thực thi đối tượng Ngoài thao tác định khơng có thao tác khác điều khiển đối tượng Về mặt thường nói thao tác mô tả kiểu, nghĩa chúng định khơng thể xảy đối tượng Cũng với lý này, kiểu liệu thích hợp gọi kiểu liệu trừu tượng (abstract data type) - trừu tượng đặc tả bên đối tượng ẩn từ thao tác mà không thuộc kiểu Một định nghĩa lớp gồm hai phần: phần đầu phần thân Phần đầu lớp định tên lớp lớp sở (base class) (Lớp sở có liên quan đến lớp dẫn xuất thảo luận chương 8) Phần thân lớp định nghĩa thành viên lớp Hai loại thành viên hỗ trợ: Dữ liệu thành viên (member data) có cú pháp định nghĩa biến định đại diện cho đối tượng lớp • Hàm thành viên (member function) có cú pháp khai báo hàm định thao tác lớp (cũng gọi giao diện lớp) • C++ sử dụng thuật ngữ liệu thành viên hàm thành viên thay cho thuộc tính phương thức nên kể từ sử dụng dụng hai thuật ngữ để đặc tả lớp đối tượng Các thành viên lớp liệt kê vào ba loại quyền truy xuất khác nhau: • Các thành viên chung (public) truy xuất tất thành phần sử dụng lớp • Các thành viên riêng (private) truy xuất thành viên lớp • Các thành viên bảo vệ (protected) truy xuất thành viên lớp thành viên lớp dẫn xuất Kiểu liệu định nghĩa lớp sử dụng kiểu có sẵn Chương 7: Lớp 92 7.1 Lớp đơn giản Danh sách 7.1 trình bày định nghĩa lớp đơn giản để đại diện cho điểm không gian hai chiều Danh sách 7.1 class Point { int xVal, yVal; public: void SetPt (int, int); void OffsetPt (int, int); }; Chú giải Hàng chứa phần đầu lớp đặt tên cho lớp Point Một định nghĩa lớp bắt đầu với từ khóa class theo sau tên lớp Một dấu { (ngoặc mở) đánh dấu điểm bắt đầu thân lớp Hàng định nghĩa hai liệu thành viên xVal yVal, hai thuộc kiểu int Quyền truy xuất mặc định cho thành viên lớp riêng (private) Vì hai xVal yVal riêng Từ khóa định từ điểm trở thành viên lớp chung (public) 4-5 Hai hàng hàm thành viên Cả hai có hai tham số nguyên kiểu trả void Dấu } (ngoặc đóng) đánh dấu kết thúc phần thân lớp Thứ tự trình bày liệu thành viên hàm thành viên lớp không quan trọng Ví dụ lớp viết tương đương này: class Point { public: void SetPt (int, int); void OffsetPt (int, int); private: int xVal, yVal; }; Định nghĩa thật hàm thành viên thường không phận lớp xuất cách tách biệt Danh sách 7.2 trình bày định nghĩa riêng biệt SetPt OffsetPt Chương 7: Lớp 93 Danh sách 7.2 void Point::SetPt (int x, int y) { xVal = x; yVal = y; } void Point::OffsetPt (int x, int y) { xVal += x; yVal += y; 10 } Chú giải Định nghĩa hàm thành viên tương tự hàm bình thường Tên hàm rõ trước với tên lớp cặp dấu hai chấm kép Điều xem SetPt thành viên Point Giao diện hàm phải phù hợp với định nghĩa giao diện trước bên lớp (nghĩa là, lấy hai tham số nguyên có kiểu trả void) 3-4 Chú ý hàm SetPt (là thành viên Point) tự tham khảo tới liệu thành viên xVal yVal Các hàm không hàm thành viên quyền Một lớp định nghĩa theo cách này, tên bao hàm kiểu liệu cho phép định nghĩa biến kiểu Ví dụ: Point pt; // pt đối tượng lớp Point pt.SetPt(10,20); // pt đặt tới (10,20) pt.OffsetPt(2,2); // pt trở thành (12,22) Các hàm thành viên sử dụng ký hiệu dấu chấm: pt.SetPt(10,20) gọi hàm SetPt đối tượng pt, nghĩa pt đối số ẩn SetPt Bằng cách tạo thành viên riêng xVal yVal phải chắn người sử dụng lớp điều khiển trực tiếp chúng: pt.xVal = 10; // không hợp lệ Điều không biên dịch Ở giai đoạn này, cần phân biệt rõ ràng đối tượng lớp Một lớp biểu thị kiểu Một đối tượng phần tử kiểu cụ thể (lớp) Ví dụ, Point pt1, pt2, pt3; định nghĩa tất ba đối tượng (pt1, pt2, pt3) lớp (Point) Các thao tác lớp ứng dụng đối tượng lớp khơng áp dụng lớp Vì lớp khái niệm khơng có tồn cụ thể mà chịu phản chiếu đối tượng Chương 7: Lớp 94 7.2 Các hàm thành viên nội tuyến Việc định nghĩa hàm thành viên nội tuyến cải thiện tốc độ đáng kể Một hàm thành viên định nghĩa nội tuyến cách chèn từ khóa inline trước định nghĩa inline void Point::SetPt (int x,int y) { xVal = x; yVal = y; } Một cách dễ để định nghĩa hàm thành viên nội tuyến chèn định nghĩa hàm vào bên lớp class Point { int xVal, yVal; public: void SetPt (int x,int y) void OffsetPt (int x,int y) }; { xVal = x; yVal = y; } { xVal += x; yVal += y; } Chú ý thân hàm chèn vào nên không cần dấu chấm phẩy sau khai báo hàm Hơn nữa, tham số hàm phải đặt tên 7.3 Ví dụ: Lớp Set Tập hợp (Set) tập đối tượng không kể thứ tự khơng lặp Ví dụ thể tập hợp định nghĩa lớp Để đơn giản giới hạn hợp số nguyên với số lượng phần tử hữu hạn Danh sách 7.3 trình bày định nghĩa lớp Set Danh sách 7.3 #include const maxCard = 100; enum Bool {false, true}; class Set { public: void EmptySet (void){ card = 0; } Bool Member (const int); void AddElem (const int); void RmvElem (const int); 10 void Copy (Set&); 11 Bool Equal (Set&); 12 void Intersect(Set&, Set&); 13 void Union (Set&, Set&); 14 void Print (void); 15 private: 16 int elems[maxCard]; // cac phan tu cua tap hop 17 int card; // so phan tu cua tap hop 18 }; Chương 7: Lớp 95 Chú giải 10 11 12 13 14 16 17 maxCard biểu thị số lượng phần tử tối đa tập hợp EmptySet xóa nội dung tập hợp cách đặt số phần tử tập hợp Member kiểm tra số cho trước có thuộc tập hợp hay không AddElem thêm phần tử vào tập hợp Nếu phần tử có tập hợp khơng làm Ngược lại thêm vào tập hợp Trường hợp mà tập hợp tràn phần tử khơng xen vào RmvElem xóa phần tử tập hợp Copy chép tập hợp tới tập hợp khác Tham số cho hàm tham chiếu tới tập hợp đích Equal kiểm tra hai tập hợp có hay không Hai tập hợp chúng chứa đựng xác số phần tử (thứ tự chúng không quan trọng) Intersect so sánh hai tập hợp tập hợp thứ ba chứa phần tử giao hai tập hợp Ví dụ, giao {2,5,3} {7,5,2} {2,5} Union so sánh hai tập hợp tập hợp thứ ba chứa phần tử hội hai tập hợp Ví dụ, hợp {2,5,3} {7,5,2} {2,5,3,7} Print in tập hợp sử dụng ký hiệu toán học theo qui ước Ví dụ, tập hợp gồm số 5, 2, 10 in {5,2,10} Các phần tử tập hợp biểu diễn mảng elems Số phần tử tập hợp biểu thị card Chỉ có đầu vào số elems xem xét phần tử hợp lệ Việc định nghĩa tách biệt hàm thành viên lớp biết tới cài đặt (implementation) lớp Sự thi công lớp Set sau Bool Set::Member (const int elem) { for (register i = 0; i < card; ++i) if (elems[i] == elem) return true; return false; } void Set::AddElem (const int elem) { if (Member(elem)) return; if (card < maxCard) elems[card++] = elem; else cout