Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
338,05 KB
Nội dung
1 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 1 L L Ớ Ớ P P Khoa Công Nghệ Thông Tin Đạihọc Bách khoa – Đạihọc ĐàNẵng CHƯƠNG CHƯƠNG 3: 3: (CLASS) (CLASS) Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 2 N N ộ ộ i i dung dung Lớp–Quyềntruyxuất Khai báo, định nghĩa1 lớp đơngiản Hàm thành viên nộituyến (inline) Hàm xây dựng (constructor) Hàm hủy (destructor) Hàm bạn(friend) –Lớpbạn Đốisố mặc định Đốisố thành viên ẩn (con trỏ this) Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 3 N N ộ ộ i i dung ( dung ( tt tt ) ) Toán tử phạmvi Danh sách khởitạothànhviê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à đốitượng của1 lớp Mảng các đốitượng Phạmvi 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 Bách khoa ĐàNẵng 4 Kh Kh á á i i ni ni ệ ệ m m l l ớ ớ p p Lớp: kiểudữ liệutrừutượng. TÊN L TÊN L Ớ Ớ P P Dữ liệu thành viên Hàm thành viên Đặctả đối tượng Tậpcác thao tác class TÊNL TÊNL Ớ Ớ P P { <Quyềntruyxuất > : DataType1 memberdata1; DataType2 memberdata2; ……………. < Quyềntruyxuất > : memberFunction1(); memberFunction2(); ………… }; private protected public 2 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 5 Đ Đ ó ó ng ng g g ó ó i i trong trong C++ C++ Khái niệm đóng gói có sẵn trong C++ class: ta có thể hạn chế quyềntruynhập đến các thành viên của đốitượng Sử dụng mộtbộ từ khoá để mô tả quyềntruynhập: private nếumột thành viên củamộtlớp đượckhaibáolàprivate, nó chỉđượctruynhập đến từ bên trong lớp đó Mặc định: mọi thành viên của class là private, do đónhấnmạnh khái niệm đóng gói củalậptrìnhhướng đốitượng. Public Các thành viên được khai báo là public có thểđượctruynhậptừ bên ngoài đối tượng là mặc định đốivới các thành viên của struct protected friend Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 6 Đ Đ ó ó ng ng g g ó ó i i trong trong C++ C++ Khi nào sử dụng quyềnnào? Theo phong cách lậptrìnhhướng đốitượng tốt, ta sẽ giữ mọi thành viên dữ liệu ở dạng private (che dấudữ liệu). Các phương thứcthường khai báo là public để có thể liên lạc được với đốitượng từ bên ngoài(giao diệncủa đốitượng). Các phương thứctiện ích chỉđược dùng bởicácphương thứckhác trong cùng lớp nên dược khai báo private. Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 7 V V í í d d ụ ụ : : L L ớ ớ p p đơn đơn gi gi ả ả n n class Point Point { int xVal, yVal; public: void SetPt (int, int); void OffsetPt (int, int); }; void Point Point::SetPt (int x, int y) { xVal = x; yVal = y; } void Point Point::OffsetPt (int x, int y) { xVal += x; yVal += y; } void main() { Point pt; pt.SetPt(10,20); pt.OffsetPt(2,2); …… pt.xVal = 10; // Đúng hay sai? Point pt1, pt2, pt3; ………. } Gọi hàm trên đốitượng Tạora đốitượng thuộclớp Point Khai báo Lớp Định nghĩa các hàm thành viên Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 8 Khai Khai b b á á o o c c á á c c phương phương th th ứ ứ c c Giao diệncủaphương thức luôn đặt trong định nghĩa lớp, cũng như các khai báo thành viên dữ liệu. Phầncàiđặt(định nghĩaphương thức) có thểđặt trong định nghĩalớphoặc đặt ở ngoài. Hai lựachọn: class Point Point { int xVal, yVal; public: void SetPt (int, int); void OffsetPt (int, int); }; void Point Point::SetPt (int x, int y) { xVal = x; yVal = y; } class Point Point { int xVal, yVal; public: void SetPt (int, int) { xVal = x; yVal = y; } void OffsetPt (int, int); }; 3 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 9 Khai Khai b b á á o o c c á á c c phương phương th th ứ ứ c c Hàm inline inline: Cảithiệntốc độ thựcthi Tốnbộ nhớ (dành cho mã lệnh) khi thựcthi. class Point Point { int xVal, yVal; public: void SetPt (int, int); void OffsetPt (int, int); }; inline void Point Point::SetPt (int x, int y) { xVal = x; yVal = y; } …………… class Point 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 C á á ch ch 2 2 : Định nghĩa bên trong lớp C C á á ch ch 1 1 : thêm Từ khóa inline Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 10 V V í í d d ụ ụ - - L L ớ ớ p p Set ( Set ( t t ậ ậ p p h h ợ ợ p p ) ) #include <iostream.h> const maxCard = 100; enum Bool {false, true}; class Set 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 < card; ++i) if (elems[i] == elem) return true; return false; } void Set::AddElem (const int elem) { if (IsMember(elem)) return; if (card < maxCard) elems[card++] = elem; else cout << "Set overflow“<<endl; } void Set::RmvElem (const int elem) { for (register i = 0; i < card; ++i) if (elems[i] == elem) { for (; i < card-1; ++i) // Dịch elems[i] = elems[i+1]; card; } } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 11 V V í í d d ụ ụ - - L L ớ ớ p p Set ( Set ( tt tt ) ) void Set::Copy (Set &set) { for (register i = 0; i < card; ++i) set.elems[i] = elems[i]; set.card = card; } Bool Set::Equal (Set &set) { if (card != set.card) return false; for (register i = 0; i < card; ++i) if (!set.IsMember(elems[i])) return false; return true; } void Set::Print (void) { cout << "{"; for (int i = 0; i < card-1; ++i) cout << elems[i] << ","; if (card > 0) cout << elems[card-1]; cout << "}“<<endl; } ……… int main (void) { Set s1, s2; s1.EmptySet(); s2.EmptySet(); s1.AddElem(10); s1.AddElem(20); s1.AddElem(30); s1.AddElem(40); s2.AddElem(30); s2.AddElem(50); s2.AddElem(10); s2.AddElem(60); cout << "s1 = "; s1.Print(); cout << "s2 = "; s2.Print(); s2.RmvElem(50); cout << "s2 - {50} = "; s2.Print(); if (s1.IsMember(20)) cout << "20 is in s1\n"; if (!s1.Equal(s2)) cout << "s1 <> s2\n"; return 0; } K K ế ế t t qu qu ả ả ? ? Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 12 H H à à m m xây xây d d ự ự ng ng (Constructor) (Constructor) Dùng để đ đ ị ị nh nh ngh ngh ĩ ĩ a a và kh kh ở ở i i t t ạ ạ o o đốitượng cùng 1 lúc. Có tên trùng vớitênlớp, không có kiểutrả về. Không gọitrựctiếp, sẽđượctựđộng gọikhikhởitạo đt. G G á á n n gi gi á á tr tr ị ị , , c c ấ ấ p p v v ù ù ng ng nh nh ớ ớ cho các d d ữ ữ li li ệ ệ u u th th à à nh nh viên viên. Constructor có thểđược khai báo chồng (đanăng hoá) như các hàm C++ thông thường khác cung cấpcáckiểukhởitạo khác nhau tuỳ theo các đốisốđượcchokhi tạothể hiện class Point 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); ………. } 4 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 13 H H à à m m xây xây d d ự ự ng ng ( ( tt tt ) ) class Point Point { int xVal, yVal; public: Point () // Hàm xây dựng mặcnhiên { xVal = 0; yVal = 0; } Point (int x=0, int y=0) { 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 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ềm dẻo hơn Không cần phảinhớ gọi hàm EmptySet EmptySet () () khi khởitạo Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 14 H H à à m m xây xây d d ự ự ng ng Đốivới constructor mặc định, nếu ta không cung cấpmộtphương thức constructor nào, C++ sẽ tự sinh constructor mặc định là mộtphương thứcrỗng (không làm gì) mục đích để luôn có một constructor nào đó để gọi khi không có tham số nào Tuy nhiên, nếutakhôngđịnh nghĩa constructor mặc định nhưng lại có các constructor khác, trình biên dịch sẽ báo lỗi không tìm thấy constructor mặc định nếutakhôngcungcấp tham số khi tạothể hiện. Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 15 Copy constructor Copy constructor Copy constructor là constructor đặcbiệt đượcgọikhitatạo đốitượng mớilàbảnsaocủamột đốitượng đãcósẵn MyClass x(5); MyClass y = x; hoặc MyClass y(x); C++ cung cấpsẵnmột copy constructor, nó chỉđơngiản copy từngthànhviêndữ liệutừđốitượng cũ sang đối tượng mới. Tuy nhiên, trong nhiềutrường hợp, ta cầnthựchiệncác công việcKhởitạo khác trong copy constructor Thí dụ: lấygiátrị cho mộtID duynhấttừđâu đó, hoặcthực hiện sao chép “sâu” (chẳng hạnkhimột trong các thành viên là con trỏ giữ bộ nhớ cấpphátđộng) Trong trường hợp đó, ta có thểđịnh nghĩalại copy constructor Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 16 Copy constructor Copy constructor Khai báo cho copy constructor củalớpFoo: Foo(const Foo& existingFoo); từ khoá const được dùng để đảmbảo đối tượng được sao chép sẽ không bị sửa đổi tham số là đốitượng được sao chép Kiểu tham số là tham chiếu đến đốitượng kiểuFoo 5 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 17 H H à à m m h h ủ ủ y y (Destructor) (Destructor) Dọndẹp1 đốitượng trư trư ớ ớ c c khi khi nó đượcthuhồi. Destructor không có giá trị trả về, và không thểđịnh nghĩalại (nó không bao giờ có tham số) mỗilớpchỉ có 1 destructor Cú pháp: ~TenLop() { …… } Không gọitrựctiếp, sẽđượctựđộng gọikhihủybỏđt. Thu Thu h h ồ ồ i i v v ù ù ng ng nh nh ớ ớ cho các d d ữ ữ li li ệ ệ u u th th à à nh nh viên viên là con con tr tr ỏ ỏ. nếu ta không cung cấp destructor, C++ sẽ tự sinh một destructor rỗng(không làm gì cả) class Set 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 bao nhiêu nhiêu l l ầ ầ n n hàm hủy đượcgọi? Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 18 B B ạ ạ n n (Friend) (Friend) – – Đ Đ ặ ặ t t v v ấ ấ n n đ đ ề ề class IntSet IntSet { public: // void SetToReal SetToReal (RealSet&); private: int elems[maxCard]; int card; }; class RealSet RealSet { public: // private: float elems[maxCard]; int card; }; TậpCác Số Nguyên TậpCác Số Thực void IntSet::SetToReal (RealSet &set) { set.card = card; for (register i = 0; i < card; ++i) set.elems[i] = (float) elems[i]; } Hàm SetToReal dùng để chuyển tậpsố nguyên thành tậpsố thực Làm thế nào để thựchiện được việctruyxuất đếnthànhviên Private Private ? Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 19 H H à à m m b b ạ ạ n n (Friend) (Friend) Cách 1: Khaibáohàmthànhviêncủalớp IntSet là b b ạ ạ n n ( friend friend) củalớp RealSet. class IntSet IntSet { public: // void SetToReal SetToReal (RealSet&); private: int elems[maxCard]; int card; }; class RealSet RealSet { public: // friend void IntSet:: SetToReal SetToReal (RealSet&); private: float elems[maxCard]; int card; }; Giữ nguyên định nghĩacủalớpIntSet Thêm dòng khai báo Friend cho hàm thành viên SetToReal Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 20 H H à à m m b b ạ ạ n n (Friend) (Friend) Cách 2: Chuyển hàm SetToReal ra ngoài ( đ đ ộ ộ c c l l ậ ậ p p). Khai báo hàm đólà b b ạ ạ n n củacả 2 lớp. class IntSet IntSet { public: // friend void SetToReal (IntSet &, RealSet&); private: int elems[maxCard]; int card; }; class RealSet RealSet { public: // friend void SetToReal (IntSet &, RealSet&); private: float elems[maxCard]; int card; }; void SetToReal SetToReal (IntSet& iSet, RealSet& rSet ) { rSet.card = iSet.card; for (int i = 0; i < iSet.card; ++i) rSet.elems[i] = (float) iSet.elems[i]; } Hàm độclập là bạn(friend) củacả 2 lớp. 6 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 21 B B ạ ạ n n (Friend) (Friend) H H à à m m b b ạ ạ n n: Có quyềntruyxuất đếntấtcả các d d ữ ữ li li ệ ệ u u và h h à à m m thành viên (protected + private) của1 lớp. Lý do: Cách định nghĩa hàm chính xác. Hàm cài đặt không hiệuquả. L L ớ ớ p p b b ạ ạ n n: Tấtcả các hàm trong lớpbạn: là hàm bạn. class A; class B { // ………. friend class A; }; class IntSet IntSet { ……… } class RealSet RealSet { // ………. friend class IntSet; }; Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 22 friend friend – – khai khai b b á á o o forward forward Một điềucầnphải chú ý khi khai báo phương thức đơn lẻ là friend: Nhớ lạicáchtađã khai báo phương thức SetToReal SetToReal (RealSet&) là friend của RealSet class RealSet RealSet { public: friend void IntSet:: SetToReal SetToReal (RealSet&); private: … }; Khi xử lý phần này, trình biên dịch cầnphảibiếtlàđãcó lớp IntSet Tuy nhiên các phương thứccủa IntSet lại dùng đến RealSet nên phảicólớp RealSet trướckhiđịnh nghĩa IntSet Cho nên ta không thể tạo IntSet khi chưatạo RealSet và không thể tạo RealSet khi chưatạo IntSet Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 23 friend friend – – khai khai b b á á o o forward forward Giải pháp: sử dụng khai báo forward (forward declaration) cho lớpcấpquanhệ friend (trong ví dụ là RealSet) Ta khai báo các lớp trong ví dụ như sau: class RealSet; // Forward declaration class IntSet IntSet { public: void SetToReal SetToReal (RealSet&); private: … }; class RealSet RealSet { public: friend void IntSet:: SetToReal SetToReal (RealSet&); private: … }; Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 24 friend friend – – khai khai b b á á o o forward forward Tuy nhiên, không thể làm ngượclại(khai báo forward cho lớp IntSet) class IntSet; // Forward declaration class RealSet RealSet { public: friend void IntSet:: SetToReal SetToReal (RealSet&); private: … }; class IntSet IntSet { public: void SetToReal SetToReal (RealSet&); private: … }; Trình biên dịch chưabiết SetToReal 7 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 25 friend friend – – khai khai b b á á o o forward forward Lý do: trình biên dịch phải nhìn thấy khai báo phương thức trong lớpnhận trướckhitạomối quan hệ friend tại lớp cho (granting class) Trong ví dụ, trình biên dịch phảibiết khai báo IntSet:: SetToReal SetToReal (RealSet&) tạikhaibáocủa IntSet trướckhicóthể tạomốiquan hệ friend của IntSet:: SetToReal SetToReal (RealSet&) với RealSet Khai báo forward cho mộtlớpchỉ cho trình biên dịch biếtvề sự có mặtcủalớp mà không cho biếtvề các thành viên củalớp đó Vậy: cần khai báo forward cho lớpcấp quyền friend trong ví dụ trên là RealSet Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 26 Đ Đ ố ố i i s s ố ố m m ặ ặ c c đ đ ị ị nh nh Đốisố mặc định tính từ bên phải. class Point Point { int xVal, yVal; public: Point (int x = 0, int y = 0); // }; void main() { Point p1; // như là ??? Point p2(10); // như là ??? Point p3(10,20); Point p4(, 20); // ????? … } class Point Point { int xVal, yVal; public: Point (int x = 0, int y = 0); Point (float x=0, float y=0); // }; void main() { Point p2(1.6, 5.0); // như là ??? Point p3(10,20); // như là ??? Point p4; // ????? … } Tốinghĩa Mơ hồ Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 27 Đ Đ ố ố i i s s ố ố th th à à nh nh viên viên ẩ ẩ n n Con Con tr tr ỏ ỏ *this *this: Là 1 thành viên ẩn, có thuộc tính là private. Trỏ tới chính bản thân đốitượng. void Point Point:: OffsetPt (int x, int y) { xVal += x; yVal += y; } void Point Point:: OffsetPt (int x, int y) { this->xVal += x; this->yVal += y; } •Cónhững trường hợpsử dụng *this là dư thừa(Vídụ trên) • Tuy nhiên, có những trường hợpphảisử dụng con trỏ *this *this Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 28 Con Con tr tr ỏ ỏ this this Tuy không bắtbuộcsử dụng tường minh con trỏ this, ta có thể dùng nó để giải quyếtvấn đề tên trùng và phạmvi void Foo::bar() { int x; x = 5; // local x this->x = 6; // this instance’s x } void Foo::bar(int x) { this->x = x; } hoặc 8 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 29 Con Con tr tr ỏ ỏ this this Con trỏ this được các phương thứctựđộng sử dụng, nên việctacósử dụng nó mộtcách tường minh hay bỏ qua không ảnh hưởng đến tốc độ chạychương trình Nhiềulập trình viên sử dụng this mộtcách tường minh mỗi khi truy nhậpcácthànhviêndữ liệu để đảmbảo không có rắcrốivề phạmvi ngoài ra, còn để tự nhắcrằng mình đang truy nhập thành viên Lựachọncódùnghay khônglàtuỳởmỗingười Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 30 To To á á n n t t ử ử ph ph ạ ạ m m vi vi Toán tử :: :: dùng để xác định chính xác hàm (thuộc tính) đượctruyxuấtthuộclớpnào. Câu lệnh: pt.OffsetPt(2,2); <=> pt.Point::OffsetPt(2,2); Cầnthiết trong mộtsố trường hợp: Cách gọi hàm trong thừakế. Tên thành viên bị che bởibiếncụcbộ. Ví dụ : Point(int xVal, int yVal) { Point::xVal = xVal; Point::yVal = yVal; } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 31 Đ Đ ặ ặ t t khai khai b b á á o o l l ớ ớ p p ở ở đâu đâu ? ? Để đảmbảotínhđóng gói, ta thường đặtkhai báo củalớp trong file header tên file thường trùng vớitênlớp. Ví dụ khai báo lớp Car đặt trong file “car.h” Phầncàiđặt(định nghĩa) đặt trong một file nguồntương ứng “car.cpp” hoặc “car.cc” Quy ước đặt khai báo/định nghĩacủalớp trong file trùng tên lớp đượcchấpnhậnrộng rãi trong C++ là quy tắcbắtbuộc đốivớicáclớpcủaJava Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 32 File header File header car.h car.h // car.h #ifndef CAR_H #define CAR_H class Car { public: // void drive(int speed, int distance); // void stop(); // void turnLeft(); private: int vin; // string make; // string model; // string color; // }; #endif 9 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 33 Đ Đ ị ị nh nh ngh ngh ĩ ĩ a a c c á á c c phương phương th th ứ ứ c c Định nghĩacủa các phương thứccần đặt trong 1 file nguồntrùngtênvớitênlớp File bắt đầuvớicáclệnh #include và có thể có các khai báo using cho các namespace Bên cạnh việc include các thư viện C++ cầnthiết, ta con phải include header file chứa khai báo lớp // car.cpp #include <iostream> #include <string> #include “car.h” using namespace std; Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 34 Đ Đ ị ị nh nh ngh ngh ĩ ĩ a a c c á á c c phương phương th th ứ ứ c c Khi định nghĩamộtphương thức, ta cầnsử dụng toán tử phạmvi để trìnhbiêndịch hiểu đólàphương thứccủa mộtlớpcụ thể chứ không phảimột hàm thông thường khác Ví dụ, định nghĩaphương thứcdrive củalớpCar đượcviết như sau // car.cpp void Car::drive(int speed, int distance) { //method definition } Tên lớp Toán tửđịnh phạmvi Tên phương thức Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 35 Đ Đ ị ị nh nh ngh ngh ĩ ĩ a a c c á á c c phương phương th th ứ ứ c c Vậycấutrúccủa file nguồnlớp Car có thể như sau: // car.cpp #include <iostream> #include <string> #include “car.h” void Car::drive(int speed, int distance) {…} void Car::stop() {…} void Car::turnLeft() {…} Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 36 Danh Danh s s á á ch ch kh kh ở ở i i t t ạ ạ o o th th à à nh nh viên viên Tương đương việcgángiátrị dữ liệuthànhviên. class Image 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 Point { int xVal, yVal; public: Point (int x, int y) { xVal = x; yVal = y; } // …………………… }; Point::Point (int x, int y) : xVal(x), yVal(y) { } 10 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 37 Th Th à à nh nh viên viên h h ằ ằ ng ng Thành viên dữ liệuhằng: Khi một thành viên dữ liệu được khai báo là const, thành viên đósẽ giữ nguyên giá trị trong suốtthờigiansống của đốitượng chủ. class Image Image { public: Image(const int w, const int h); private: const const int int width; const const int int height; // }; Image::Image (const int w, const int h) : width(w), height(h) { // } Khai báo bình thường như dữ liệuthànhviên class Image Image { const int width = 256; const int height = 168; // }; Khởitạo SAI Khởitạo ĐÚNG thông qua danh sách khởitạo thành viên Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 38 Th Th à à nh nh viên viên h h ằ ằ ng ng Hằng đốitượng: không đượcthayđổigiátrị. Hàm thành viên hằng: Được phép gọi trên hằng đốitượng.(đảmbảo không thay đổigiá trị của đốitượng chủ) Không đượcthayđổigiátrị dữ liệu thành viên. nên khai báo mọiphương thứctruyvấnlàhằng, vừa để báo với trình biên dịch, vừa để tự gợinhớ. class Set 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 } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 39 Th Th à à nh nh viên viên t t ĩ ĩ nh nh Thành viên dữ liệutĩnh: Dùng chung 1 bản sao chép (1 vùng nhớ) chia sẻ cho tấtcảđốitượng củalớp đó. Sử dụng: <TênLớp>::<TênDữLiệuThànhViên> Thường dùng để đếmsố lượng đốitượng. class Window Window { // danh sách liên kếttấtcả Window static Window *first; // con trỏ tới window kế tiếp Window *next; // }; Window * Window:: Window::first = &myWindow; // ……………. Khởitạo dữ liệu thành viên tĩnh Khai báo Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 40 Th Th à à nh nh viên viên t t ĩ ĩ nh nh - - V V í í d d ụ ụ Đếmsốđốitượng MyClass khai báo lớpMyClass class MyClass { public: MyClass(); // Constructor ~MyClass(); // Destructor void printCount();//Output current value of count private: static int count;//static member to store //number of instances of MyClass }; [...]... không đối số (hàm xây dựng mặc nhiên - default constructor) 51 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 52 13 Phạm vi lớp Cấu trúc và hợ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 public: Rectangle (int, int, int, int); // private: class Point { public: Point(int a, int b) { … } private: int... Tin - Đại Học Bách khoa Đà Nẵng Khởi tạo ĐÚNG thông qua danh sách khởi tạo thành viên 48 12 Mảng các đối tượng 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); // private: Point topLeft; Point... thành viên dữ liệu cần giữ nguyên cùng một giá trị tại tất cả các đối tượng của một lớp Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 45 Thành viên tĩnh Khai báo Định nghĩa hàm thành viên tĩnh Truy xuất hàm thành viên tĩnh 46 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Thành viên tham chiếu Hàm thành viên tĩnh: ví dụ class MyClass { public: MyClass(); // Constructor ~MyClass(); // Destructor... delete x; MyClass::printCount(); } Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Tương đương với hàm toàn cục Phương thức tĩnh không được truy n con trỏ this làm tham số ẩn Không thể sửa đổi các thành viên dữ liệu từ trong phương thức tĩnh Gọi thông qua: :: 47 Tham chiếu dữ liệu thành viên: class Image { int width; int height; int &widthRef; // }; Khởi tạo SAI Khai báo bình thường... static, ta có hiệu quả kết hợp chương trình demo sử dụng MyClass int main() { MyClass* x = new MyClass; x->PrintCount(); MyClass* y = new MyClass; x->PrintCount(); y->PrintCount(); delete x; y->PrintCount(); } 42 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng một thành viên dữ liệu được định nghĩa là static const là một hằng được chia sẻ giữa tất cả các đối tượng của một lớp Không như các thành viên... 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) }; 50 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Phạm vi lớp Sử dụng dạng con trỏ: Thành viên trong 1 lớp: Cấp vùng nhớ: Che các thực thể trùng tên trong phạm vi VD: Point *pentagon = new Point[5]; Thu hồi vùng nhớ: delete[] pentagon; delete pentagon; // Thu hồi vùng nhớ đầu // ………... dùng chung cho mọi thể hiện của một lớp const đối với các thành viên dữ liệu cần giữ nguyên giá trị trong suốt thời gian sống của một thể hiện class Window { // ……… static void PaintProc () { … } // ……… }; void main() { // …………… Window::PainProc(); Window:: } static const đối với các thành viên dữ liệu cần giữ nguyên cùng một giá trị tại tất cả các đối tượng của một lớp Khoa Công Nghệ Thông Tin - Đại... trúc và hợp class Pair { Value Value // }; *head; *tail; Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng 54 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa Đà Nẵng Điều khiển đối tượng ở mức bit VD: Truy xuất các bit trong header của gói tin 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 integer; real; *string;...Thành viên tĩnh - Ví dụ Thành viên tĩnh Định nghĩa và khởi tạo thành viên tĩnh được lưu trữ độc lập với các thể hiện của lớp, do đó, các thành viên tĩnh phải được định nghĩa int MyClass::count; Cài đặt các phương thức int MyClass::count = 0; MyClass::MyClass() { this->count++; // Increment the static count } MyClass::~MyClass()... Thu hồi vùng nhớ đầu // ……… int fork (void); // fork hệ thống class Process { int fork (void); // fork thành viên // }; Không cần biết kích thước mảng 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 // } // các đỉnh // số các đỉnh Khoa Công Nghệ Thông Tin - Đại Học Bách khoa . Đạihọc Bách khoa – Đạihọc ĐàNẵng CHƯƠNG CHƯƠNG 3: 3: (CLASS) (CLASS) Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 2 N N ộ ộ i i dung dung Lớp Quyềntruyxuất Khai báo, định nghĩa1 lớp đơngiản . phạmvi lớp Process 14 Khoa Công Nghệ Thông Tin - Đại Học Bách khoa ĐàNẵng 53 Ph Ph ạ ạ m m vi vi l l ớ ớ p p Lớptoàncục: đại đasố lớp trong C++. Lớplồng nhau: lớpchứa đựng lớp. Lớpcụcbộ:. thể hạn chế quyềntruynhập đến các thành viên của đốitượng Sử dụng mộtbộ từ khoá để mô tả quyềntruynhập: private nếumột thành viên củamộtlớp đượckhaibáolàprivate, nó chỉđượctruynhập đến từ