CHƯƠNG 7: LỚP (CLASS)
lượt xem 21
download
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).
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: 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 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 Đặc tả class TÊNLỚP TÊN LỚP đối [: LỚPCHA ] tượng { : Dữ liệu DataType1 memberdata1; thành viên DataType2 memberdata2; ……………. < Quyền truy xuất > : Tập các Hàm thao tác memberFunction1(); 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); 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àm thà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
- 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) khi thực thi. Cách 1: 1 class Point { 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
- Chương 7 Ví dụ - Lớp Set (tập hợp) #include 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
- Chương 7 Ví 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
- 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; 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 { 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
- 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ỏ. 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 ~Set() { delete[] elems; } s2 = TestFunct1(s1); đượ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. 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
- 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) { Point void Point::OffsetPt (int x, int y) { Point 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 { 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 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
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Lập trình với Java (P10)
28 p | 218 | 68
-
Bài tập Lập trình python: Phần 2
105 p | 39 | 28
-
Lập trình Java cơ bản : Multithreading part 2
5 p | 148 | 21
-
Một số lớp cơ sở
28 p | 135 | 18
-
Bài giảng Phân tích thiết kế hệ thống thông tin: Chương 7 - Nguyễn Hoàng Ân
46 p | 81 | 6
-
Bài giảng C# và môi trường Donet - Bài 7: Lớp trừu tượng và giao diện
13 p | 48 | 4
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn