LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 3 ppt

12 422 4
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 3 ppt

Đ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

GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn học 1 Chương 3: XÂY DỰNG LỚP Giáo viên: Võ Hồng Bảo Châu Khoa CNTT trường ĐH Lạc Hồng LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG MỤC TIÊUMỤC TIÊU • Xây dựng lớp cơ bản dùng C/C++ • Phân biệt được public, private • 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 OOP-CHƯƠNG 3-XÂY DỰNG LỚP 2 NỘI DUNG CHI TIẾTNỘI DUNG CHI TIẾT • LỚP (CLASS) VÀ ĐỐI TƯỢNG (OBJECT) • 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 • SO VỚI STRUCT TRONG C++ • THUỘC TÍNH TRUY CẬP • LOẠI HÀNH VI CỦA LỚP OOP-CHƯƠNG 3-XÂY DỰNG LỚP 3 LỚP LÀ GÌ ?LỚP LÀ GÌ ? • 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 Lan Cúc TrúcMai girl class object OOP-CHƯƠNG 3-XÂY DỰNG LỚP 4 GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn học 2 Như vậy,Như vậ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. • 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. • Có thể xem lớp như một dạng đối tượng (object's type) • 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 OOP-CHƯƠNG 3-XÂY DỰNG LỚP 5 HIỆN THỰC LỚP TRONG C++HIỆN THỰC LỚP TRONG C++ class NAME{ //members }; • Như vậy, lớp được bao bọc bởi từ khóa class ở bên ngoài. • Bên trong là các thành phần, bao gồm dữ liệu và hành vi. OOP-CHƯƠNG 3-XÂY DỰNG LỚP 6 KHAI BÁO CLASSKHAI BÁO CLASS class ClassName [: [<public|private>] <FatherClassName,] { public : < data > <method> private : < data > < method> protected : < data > <method> } ; // có ký tự ‘;’ • 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: từ khóa chỉ định đặc tính của từng thành phần ngay 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 7 HIỆN THỰC HÀNH VI CHO CLASSHIỆN THỰC HÀNH VI CHO CLASS • 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> } • Hiện thực bên ngoài class DataType ClassName::MethodName (Parameters) { <code> } • Toán tử :: là toán tử xác định tầm vực của method (scope OOP-CHƯƠNG 3-XÂY DỰNG LỚP 8 GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn học 3 VÍ DỤ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 9 SO VỚI STRUCT TRONG C/C++SO VỚI STRUCT TRONG C/C++ • class có thêm các hàm chứa bên trong • Các hàm phải chỉ định thêm thuộc tính truy cập (access attributes), chẳng hạn – public – private – protected • Các dữ liệu thành viên cũng phải có thuộc tính truy cập OOP-CHƯƠNG 3-XÂY DỰNG LỚP 10 SO VỚI STRUCT TRONG C/C++SO VỚI STRUCT TRONG C/C++ • Chẳng hạn, struct PERSON{ char name[40]; int birthYear; }; • Tương đương với class PERSON{ public: char name[40]; int birthYear; }; Khi đó mới có thể truy cập được name, birthYear như đã làm trong kiểu struct. OOP-CHƯƠNG 3-XÂY DỰNG LỚP 11 SO VỚI STRUCT TRONG C/C++SO VỚI STRUCT TRONG C/C++ struct StructName { <data> }; Type1 Func1 (StructName stru) { <code>} Type2 Func2 (StructName stru) {<code>} các hàm đều toàn cục class ClassName { <data> Modifier : Type1 Func1 () { <code>} Modifier : Type2 Func2 () { <code>} }; Chỉ có method public là toàn cục public private protected OOP-CHƯƠNG 3-XÂY DỰNG LỚP 12 GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn học 4 HOÀN THIỆN LỚPHOÀN THIỆN LỚP • Lớp PERSON ở trên mới chỉ mang tính mô tả, chưa sử dụng được • Để hoàn thiện, có 2 cách viết khác nhau – Đơn giản – Phức tạp OOP-CHƯƠNG 3-XÂY DỰNG LỚP 13 Cách đơn giảnCách đơn giản class PERSON{ char name[40]; int birthYear; public: void getData(){ cout << "Name: "; cin.getline(name, 39); cout << "Year of birth: "; cin >> birthYear; } int age(){ cout << name << " is " << 2008 – birthYear << " years old\n" } }; OOP-CHƯƠNG 3-XÂY DỰNG LỚP 14 Phức tạp và chuyên nghiệp hơnPhứ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(){ cout << "Name: "; cin.getline(name, 39); cout << "Year of birth: "; cin >> birthYear; } int PERSON::age(){ cout << name << " is " << 2008 – birthYear << " years old\n" } OOP-CHƯƠNG 3-XÂY DỰNG LỚP 15 Lưu ý,Lưu ý, • 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 16 GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn học 5 Ví dụVí dụ #include <iostream.h> main() { char name[4][40]; int n = 0; 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; } OOP-CHƯƠNG 3-XÂY DỰNG LỚP 17 TẠO ĐỐI TƯỢNGTẠO ĐỐI TƯỢNG • 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; • a, b là 2 đối tượng. • 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. OOP-CHƯƠNG 3-XÂY DỰNG LỚP 18 • Trong ví dụ trên, có thể tạo các đối tượng như sau: main(){ PERSON a; a.getData(); a.age() } OOP-CHƯƠNG 3-XÂY DỰNG LỚP 19 THUỘC TÍNH TRUY CẬP LÀ GÌ ?THUỘC TÍNH TRUY CẬP LÀ GÌ ? • Hay còn gọi hình thức truy cập, hay tầm nhìn. • 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 – protected – public OOP-CHƯƠNG 3-XÂY DỰNG LỚP 20 GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn học 6 publicpublic • 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 ngoài. OOP-CHƯƠNG 3-XÂY DỰNG LỚP 21 privateprivate • 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 rằng đây là những thành viên riêng 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. OOP-CHƯƠNG 3-XÂY DỰNG LỚP 22 protectedprotected • 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ể giao tiếp với các thành viên trong lớp con cháu. OOP-CHƯƠNG 3-XÂY DỰNG LỚP 23 Giả sử có lớp sau đâyGiả sử có lớp sau đây #include <iostream.h> class POINT{ int x, y; public: void set( int xx, int yy ){ x = xx; y = yy; } int get( int& xx, int& yy ){ xx = x; yy = y; return 1; } }; OOP-CHƯƠNG 3-XÂY DỰNG LỚP 24 GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn học 7 main() { POINT p; p.set( 10, 5 ); cout << p.x << " " << p.y << endl; return 1; } Không được OOP-CHƯƠNG 3-XÂY DỰNG LỚP 25 Sửa lạiSửa lại main() { POINT p; p.set( 10, 5 ); int x, y; p.get( x,y ); cout << "Coordinate (" << x << "," << y << ")\n"; return 1; } OOP-CHƯƠNG 3-XÂY DỰNG LỚP 26 LOẠI HÀNH VI CỦA LỚPLOẠI HÀNH VI CỦA LỚP • Tự động thực hiện • Nhận biết và thay đổi giá trị dữ liệu • Phép toán • Đặc thù của lớ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. OOP-CHƯƠNG 3-XÂY DỰNG LỚP 27 SỬ DỤNG CLASSSỬ DỤNG CLASS • 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) • Cú pháp: ClassName Obj, *pObj = new ClassName; ClassName ObjArr1[100]; 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 28 GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn học 8 VÍ DỤ 1VÍ DỤ 1 OOP-CHƯƠNG 3-XÂY DỰNG LỚP 29 VÍ DỤ 2: public access specifier VÍ DỤ 2: public access specifier OOP-CHƯƠNG 3-XÂY DỰNG LỚP 30 VÍ DỤ 3 protected access specifier VÍ DỤ 3 protected access specifier OOP-CHƯƠNG 3-XÂY DỰNG LỚP 31 VÍ DỤ 3- private access specifierVÍ DỤ 3- private access specifier OOP-CHƯƠNG 3-XÂY DỰNG LỚP 32 GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn học 9 Gợi ý về xây dựng chương trình OOPGợ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 public của class vì hàm main cần đến chú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 33 Kinh nghiệmKinh 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 newValue); 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 34 Ví dụVí dụ class CIRCLE { double x,y,r; public: 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 35 Sử dụng class trong hàm mainSử dụng class trong hàm main • Xác định các biến đối tượng cần có. • 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. OOP-CHƯƠNG 3-XÂY DỰNG LỚP 36 GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn học 10 BÀI TẬP VÍ DỤBÀI TẬP VÍ DỤ (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 37 Ví 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. Ví 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: • 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ác vụ (hành vi của lớp): Nhập, Xuất nghiệm. class HPTB1 data: double a,b,c,d,e,f methods: Nhap() , XuatNghiem() OOP-CHƯƠNG 3-XÂY DỰNG LỚP 38 #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 39 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. 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 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 ; #include <iostream.h> #include <conio.h> class MangInt { private: int* a, n; public: void Input(); int GetMax(); void AscSort(); void 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]; } } Phải hiện thực bên ngoài lớp vì có dùng phát biểu lặp OOP-CHƯƠNG 3-XÂY DỰNG LỚP 40 [...]... đị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 . protected access specifier OOP-CHƯƠNG 3- XÂY DỰNG LỚP 31 VÍ DỤ 3- private access specifierVÍ DỤ 3- private access specifier OOP-CHƯƠNG 3- XÂY DỰNG LỚP 32 GV: Võ Hồng Bảo Châu Chương 0: Giới thiệu môn. return 1; } OOP-CHƯƠNG 3- XÂY DỰNG LỚP 17 TẠO ĐỐI TƯỢNGTẠO ĐỐI TƯỢNG • 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; • a, b là 2 đối tượng. • Khi đó. VI CỦA LỚP OOP-CHƯƠNG 3- XÂY DỰNG LỚP 3 LỚP LÀ GÌ ?LỚP LÀ GÌ ? • 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 Lan Cúc TrúcMai girl class object OOP-CHƯƠNG 3- XÂY DỰNG LỚP 4 GV:

Ngày đăng: 11/07/2014, 20:20

Từ khóa liên quan

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

Tài liệu liên quan