CHƯƠNG 3 CÁCH THỨC XÂY DỰNG LỚP pdf

12 349 0
CHƯƠNG 3 CÁCH THỨC XÂY DỰNG LỚP pdf

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

14/04/2010 1 CHƯƠNG 3 CÁCH THỨC XÂY DỰNG LỚP 1 OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu MỤC TIÊU y Xây dựng lớp cơ bản dùng C/C++ y Phân biệt được public, private y Cách viết chương trình chính sử dụng lớp, cách truy cập đến thành viên của lớp 2 OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu NỘI DUNG CHI TIẾT y LỚP (CLASS) VÀ ĐỐI TƯỢNG (OBJECT) y HIỆN THỰC LỚP TRONG C++ { KHAI BÁO LỚP { HiỆN THỰC HÀNH VI HOÀN THI Ệ N L Ớ P 3 { HOÀN THI Ệ N L Ớ P y SO VỚI STRUCT TRONG C++ y THUỘC TÍNH TRUY CẬP y LOẠI HÀNH VI CỦA LỚP OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 4 LỚP LÀ GÌ ? y Khi một số các đối tượng cùng tính chất được nhóm lại, tạo nên lớp girl class object OOP-CHƯƠNG 3-XÂY DỰNG LỚP Lan Cúc Trúc Mai GV: Võ Hồng Bảo Châu 14/04/2010 2 5 Như vậy, y Lớp được dùng để mô tả tất cả các đối tượng có hành vi và dữ liệu tương tự nhau. y Một lớp là một mẫu (template) hay một khuôn dạng (mold) để từ đó có thể tạo ra những đối tượng mới. ể ố OOP-CHƯƠNG 3-XÂY DỰNG LỚP y Có th ể xem l ớ p như một dạn g đ ố i tư ợ n g (ob j ect's type) y Hay kiểu dữ liệu (data type) Lớp là sự biểu diễn của một mẫu các đối tượng và mô tả cách mà những đối tượng này được cấu tạo bên trong GV: Võ Hồng Bảo Châu 6 HIỆN THỰC LỚP TRONG C++ class NAME{ //members }; y Như vậy, lớp được bao bọc bởi từ khóa class ở bên OOP-CHƯƠNG 3-XÂY DỰNG LỚP n g oài. y Bên trong là các thành phần, bao gồm dữ liệu và hành vi. GV: Võ Hồng Bảo Châu 7 KHAI BÁO CLASS class ClassName [: [<public|private>] <FatherClassName,] { public : < data > <method> private : < data > •Chương này tạm không đề cập đến đặc tính thừa kế -Có chương riêng về tính thừa kế. •Các thuộc tính truy cập: public, private, protected: ầ < data > < method> protected : < data > <method> } ; // có ký tự ‘;’ từ khóa chỉ đ ịnh đ ặc tính của từn g thành p h ầ n n g a y sau chỉ thị này. Mặc định là private. • public: cho phép bên ngoài truy cập Æ interface của lớp. • private: các thành phần nội, không cho phép bên ngoài truy cập. •protected: các thành phần dành cho lớp thừa kế truy cập, không cho phép các đối tượng không phải là con truy cập. OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 8 HIỆN THỰC HÀNH VI CHO CLASS y Hiện thực bên trong class – Các hành vi inline Æ Không dùng các phát biểu continue , do , for , goto , switch , case , break , while. Cú pháp: DataType MethodName (Parameters) { <code> { <code> } y Hiện thực bên ngoài class DataType ClassName::MethodName (Parameters) { <code> } y Toán tử :: là toán tử xác định tầm vực của method (scope resolution operator) OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 14/04/2010 3 9 VÍ DỤ OK Khi hiện thực method bên ngoài class, KHÔNG khai báo lại access-specifier. OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 10 SO VỚI STRUCT TRONG C/C++ y class có thêm các hàm chứa bên trong y Các hàm phải chỉ định thêm thuộc tính truy cập (access attributes), chẳng hạn { public OOP-CHƯƠNG 3-XÂY DỰNG LỚP { private { protected y Các dữ liệu thành viên cũng phải có thuộc tính truy cập GV: Võ Hồng Bảo Châu 11 SO VỚI STRUCT TRONG C/C++ y Chẳng hạn, struct PERSON{ char name[40]; int birthYear; }; y Tương đương với class PERSON{ public: char name[40]; int birthYear; OOP-CHƯƠNG 3-XÂY DỰNG LỚP }; int birthYear; }; Khi đó mới có thể truy cập được name, birthYear như đã làm trong kiểu struct. GV: Võ Hồng Bảo Châu SO VỚI STRUCT TRONG C/C++ 12 struct StructName { <data> }; class ClassName { <data> Modifier : Type1 Func1 () public private protected OOP-CHƯƠNG 3-XÂY DỰNG LỚP }; Type1 Func1 (StructName stru) { <code>} Type2 Func2 (StructName stru) {<code>} các hàm đều toàn cục Modifier : Type1 Func1 () { <code>} Modifier : Type2 Func2 () { <code>} }; Chỉ có method public là toàn cục GV: Võ Hồng Bảo Châu 14/04/2010 4 13 HOÀN THIỆN LỚP y Lớp PERSON ở trên mới chỉ mang tính mô tả, chưa sử dụng được y Để hoàn thiện, có 2 cách viết khác nhau { Đơn giản h OOP-CHƯƠNG 3-XÂY DỰNG LỚP { P h ứ c t ạ p GV: Võ Hồng Bảo Châu 14 Cách đơn giản class PERSON{ char name[40]; int birthYear; public: void getData(){ cout << "Name: "; cin. g etline(name, 39); OOP-CHƯƠNG 3-XÂY DỰNG LỚP g cout << "Year of birth: "; cin >> birthYear; } int age(){ cout << name << " is " << 2008 – birthYear << " years old\n" } }; GV: Võ Hồng Bảo Châu 15 Phức tạp và chuyên nghiệp hơn class PERSON{ char name[40]; int birthYear; public: void getData(); int age(); }; void PERSON::getData(){ OOP-CHƯƠNG 3-XÂY DỰNG LỚP void PERSON::getData(){ cout << "Name: "; cin.getline(name, 39); cout << "Year of birth: "; cin >> birthYear; } int PERSON::age(){ cout << name << " is " << 2008 – birthYear << " years old\n" } GV: Võ Hồng Bảo Châu 16 Lưu ý, y Trong lớp PERSON cũng có một vài điều nho nhỏ cần quan tâm về việc dùng ngôn ngữ C++. { Do phép toán trích (>>) chỉ nhận chuỗi ký tự không chứa ký tự blank (space, tab, new line), nên phải dùng hàm getline(). { Hàm getline() có trong l ớ p ch ứ a đ ố i t ượ ng cin . OOP-CHƯƠNG 3-XÂY DỰNG LỚP { Hàm getline() có trong l ớ p ch ứ a đ ố i t ượ ng cin . GV: Võ Hồng Bảo Châu 14/04/2010 5 17 Ví dụ #include <iostream.h> main() { char name[4][40]; int n = 0; cout << " Name of people loved me \ n " ; OOP-CHƯƠNG 3-XÂY DỰNG LỚP cout << Name of people loved me \ n; while(cin.getline(name[n++],40)); n; cout << "They are as follow\n"; for ( int i = 0; i < n; i++ ) cout << name[i] << "\n"; return 1; } GV: Võ Hồng Bảo Châu 18 TẠO ĐỐI TƯỢNG y Sau khi có lớp, có thể tạo đối tượng bằng cách khai báo biến thuộc kiểu lớp PERSON a, b; y a, b là 2 đối tượng. OOP-CHƯƠNG 3-XÂY DỰNG LỚP y Khi đó a và b có thể coi là 2 instance (là ví dụ, là trường hợp, là cái có thực) của lớp PERSON. GV: Võ Hồng Bảo Châu 19 y Trong ví dụ trên, có thể tạo các đối tượng như sau: main(){ PERSON a; a. g etData (); OOP-CHƯƠNG 3-XÂY DỰNG LỚP g (); a.age() } GV: Võ Hồng Bảo Châu 20 THUỘC TÍNH TRUY CẬP LÀ GÌ ? y Hay còn gọi hình thức truy cập, hay tầm nhìn. y Có 3 thuộc tính, nhằm để quy định khả năng truy cập đến các thành viên của lớp, có "trông thấy" được thành viên nào đó không: { private OOP-CHƯƠNG 3-XÂY DỰNG LỚP { private { protected { public GV: Võ Hồng Bảo Châu 14/04/2010 6 21 public y Từ bất kỳ hàm nào có chứa đối tượng thuộc lớp, đều truy cập được các thành viên có thuộc tính này. { Vì vậy những thành viên mang thuộc tính public còn được xem là thành viên có khả năng giao tiếp với môi trường bên n g oài. OOP-CHƯƠNG 3-XÂY DỰNG LỚP g GV: Võ Hồng Bảo Châu 22 private y private: ngược lại với public, các thành viên mang thuộc tính private chỉ được truy cập từ những hành vi thuộc lớp và từ những hành vi bè bạn (friend), từ những lớp là bè bạn của nó. { private là thuộc tính chuẩn của ngôn ngữ C++, để thông báo ằ OOP-CHƯƠNG 3-XÂY DỰNG LỚP r ằ n g đâ y là nh ữ n g thành viên riên g t ư c ủa l ớ p , nội bộ c ủa l ớ p mới nhìn thấy, mới nói chuyện được, chúng không giao tiếp với thế giới bên ngoài lớp. GV: Võ Hồng Bảo Châu 23 protected y protected: để cho phép các thành viên trong những lớp hậu duệ được quyền truy cập đến. { Nói cách khác, ngoài việc nói chuyện với các thành viên của lớp, những thành viên có thuộc tính truy cập protected còn có thể g iao tiế p v ớ i các thành viên tron g l ớ p con cháu. OOP-CHƯƠNG 3-XÂY DỰNG LỚP g p g p GV: Võ Hồng Bảo Châu 24 Giả sử có lớp sau đây #include <iostream.h> class POINT{ int x, y; public: void set( int xx, int yy ){ x = xx; OOP-CHƯƠNG 3-XÂY DỰNG LỚP y = yy; } int get( int& xx, int& yy ){ xx = x; yy = y; return 1; } }; GV: Võ Hồng Bảo Châu 14/04/2010 7 25 main() { POINT p; p .set ( 10 , 5 ); Không được OOP-CHƯƠNG 3-XÂY DỰNG LỚP p(,); cout << p.x << " " << p.y << endl; return 1; } GV: Võ Hồng Bảo Châu 26 Sửa lại main() { POINT p; p.set( 10, 5 ); int x y; OOP-CHƯƠNG 3-XÂY DỰNG LỚP int x , y; p.get( x,y ); cout << "Coordinate (" << x << "," << y << ")\n"; return 1; } GV: Võ Hồng Bảo Châu 27 LOẠI HÀNH VI CỦA LỚP y Tự động thực hiện y Nhận biết và thay đổi giá trị dữ liệu y Phép toán y Đ ặ c thù của l ớ p OOP-CHƯƠNG 3-XÂY DỰNG LỚP ặ p Mỗi hành vi có thể có thuộc tính truy cập khác nhau. Những hành vi chỉ phục vụ cho hành vi khác của lớp sẽ có thuộc tính là private. GV: Võ Hồng Bảo Châu 28 SỬ DỤNG CLASS y Sử dụng class trong chương trình là định nghĩa biến đối tượng (biến tĩnh, biến động, mảng tĩnh, mảng động) y Cú pháp: ClassName Obj, *pObj = new ClassName; ClassName ObjArr1[100]; ClassName * ObjArr2; ClassName ObjArr2; int MaxCount=100; ObjArr2= new ClassName[MaxCount]; Truyền thông báo cho 1 đối tượng: Obj.Method1(); pObj -> Method2(); ObjArr1[20].Method3(); ObjArr2[7].Method4(); OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 14/04/2010 8 VÍ DỤ 1 29 OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu VÍ DỤ 2: public access specifier 30 OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu VÍ DỤ 3 protected access specifier 31 OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu VÍ DỤ 3- private access specifier 32 OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 14/04/2010 9 33 Gợi ý về xây dựng chương trình OOP Xây dựng class (1) Lấy các khái niệm liên quan đến bài toán (danh từ chính trong đề bài) để xây dựng thành class (thí dụ: Sinh viên). (2) Lấy các danh từ mô tả liên quan đến từng khaí niệm ở bước (1). Đó chính là các thuộc tính của class( thí dụ: tên, tuổi, địa chỉ). (3) Lấy các tác vụ phải xử lý (động từ trong đề bài). Đó chính là các hành vi bli ủ l ì hà i ầ đ ế hú pu bli c c ủ a c l ass vì hà m ma i n c ầ n đ ế n c hú ng. (4) Tự hỏi: Để có thể thực hiện hành vi public trong bước 3, có cần thêm các hành vi phụ trợ nào không? Nếu có thì đó là hành vi thêm. (5) Môi trường bên ngoài thực sự chỉ cần các hành vi nào thì đó là các hành vi public. Các hành vi còn lại là các hành vi private hoặc protected. (5) Liệu lớp này có cần được phát triển thêm để giải các bài toán thuộc nhóm bài toàn này nữa hay không? Nếu có thì một số hành vi cần có thuộc tính protected. OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 34 Kinh nghiệm Mỗi thuộc tính của class, người ta thường xây dựng 2 hành vi public: DataType getPropertyName(); void setProperTyName (DataType Vl ) new V a l ue ) ; Với 2 hành vi này, bên ngoài truy xuất được từng thuộc tính của đối tượng. Các hành vi khác đều cần đến các hành vi này. OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 35 Thí dụ: class CIRCLE { double x,y,r; public: double getR() { return r ; } ể double getR() { return r ; } void setR (double newr) { if ( newr >=0 ) r = newr ; } }; Có cơ hội ki ể m tra dữ liệu đầu vào OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 36 Sử dụng class trong hàm main y Xác định các biến đối tượng cần có. y Trật tự xử lý của đề bài chính là trật tự truyền thông báo cho các đ ố i t ượ ng báo cho các đ ố i t ượ ng . OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 14/04/2010 10 BÀI TẬP VÍ DỤ 37 (1) Viết chương trình nhập 1 hệ phương trình bậc nhất 2 ẩn. Xuất nghiệm. (2) Viết chương trình nhập 1 mảng số nguyên, xuất trị lớn nhất, xuất mảng tăng dần. OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 38 Thí dụ:Viết chương trình nhập 1 hệ phương trình bậc nhất 2 ẩn.Xuất nghiệm. Phân tích: y Khái niệm liên quan: Hệ phương trình bậc nhất 2 ẩn Æ ax+by = c Î class HPTB1 dx+ey = f Tá (hà h i ủ l ớ ) Nh ậ X ấ hi ệ y Tá c v ụ (hà n h v i c ủ a l ớ p) : Nh ậ p , X u ấ t n ghi ệ m. Îclass HPTB1 data: double a,b,c,d,e,f methods: Nhap() , XuatNghiem() OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 39 #include <conio.h> #include <iostream.h> class HPTB1 { double a,b,c,d,e,f ; // private , default public : // các hành vi bên ngoài cần để tương tác void Nhap() // Hiện thực method bên trong khai báo class { cout << "Nhap 3 he so a,b,c cua phuong trinh 1 ax+by=c :"; cin>>a>>b>>c; cout << "Nhap 3 he so d,e,f cua phuong trinh 2 dx+ey=f :"; cin>>d>>e>>f; } void XuatNghiem(); // chỉ prototype, để hiện thực bên ngoài khi báo class }; void PTB1::XuatNghiem() // Hiện thực method bên ngoài khai báo class { double D=a*e-b*d ; ; if (D==0) cout<< "Vo nghiem"; else cout<< "Nghiem x=" << (c*e-b*f)/D << “ Nghiem y=" << (a*f-c*d)/D <<'\n'; } void main() { HPTB1 p; // định nghĩa 1 hệ phương trình bậc nhất p clrscr(); p.Nhap(); // Truyền thông báo nhập cho p p.XuatNghiem(); // Truyền thông báo xuất nghiệm cho p getch(); } OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 40 Thí dụ: Viết chương trình nhập 1 mảng số nguyên int, xuất trị lớn nhất, xuất mảng tăng dần. Phân tích Khái niệm liên quan : mảng số int , mô tả bằng int* a, n Tác vụ: Input (nhập), GetMax (lấy trị lớn nhất), AscSort (sắp xếp tăng), Output (xu ấ t). T ấ t c ả đ ề u #include <iostream.h> #include <conio.h> class MangInt { private: int* a, n; public: void Input(); int GetMax(); void AscSort(); void Output(); } Phải hiện thực bên ngoài lớp vì có dùng phát biểu lặp Output (xu ấ t). T ấ t c ả đ ề u cần cho bên ngoài truy xuất vì hàm main cần sử dụng các tác vụ này. Giải bài toán: Cần 1 mảng (tên m). Trật tự truyền thông báo: m.Input(); cout << m.GetMax(); m.AscSort(); m.Output; } ; void MangInt:: Input() { do { cout<< “ Number of element:”; cin>> n; } while (n<=0); a= new int[n]; // cấp bộ nhớ for (int i=0; i<n;i++) { cout << “a[“ << i << “]=“; cin>>a[i]; } } OOP-CHƯƠNG 3-XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu [...]... Behavior Sử dụng lớp là định nghĩa biến (đơn, mảng, pointer) ế thuộc lớp theo cú pháp định nghĩa biến của C Nhập dữ liệu cơ bản: cin >> SimpleVar; Xuất dữ liệu cơ bản : cout . 30 OOP-CHƯƠNG 3- XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu VÍ DỤ 3 protected access specifier 31 OOP-CHƯƠNG 3- XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu VÍ DỤ 3- private access specifier 32 OOP-CHƯƠNG 3- XÂY DỰNG LỚP GV:. 14/04/2010 1 CHƯƠNG 3 CÁCH THỨC XÂY DỰNG LỚP 1 OOP-CHƯƠNG 3- XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu MỤC TIÊU y Xây dựng lớp cơ bản dùng C/C++ y Phân biệt được public, private y Cách viết chương trình. Method2(); ObjArr1[20].Method3(); ObjArr2[7].Method4(); OOP-CHƯƠNG 3- XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu 14/04/2010 8 VÍ DỤ 1 29 OOP-CHƯƠNG 3- XÂY DỰNG LỚP GV: Võ Hồng Bảo Châu VÍ DỤ 2: public access specifier 30 OOP-CHƯƠNG

Ngày đăng: 27/07/2014, 13:21

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan