Bài giảng Lập trình hướng đối tượng - Các phương thức

Đối tượng có thể có bốn kiểu hành vi cơ bản: tạo, truy vấn, cập nhật, và huỷ.

Các loại phương thức có thể sử dụng để cài đặt các hành vi trên

các phương thức tạo – constructors

dùng để khởi tạo một thể hiện của lớp

các phương thức truy vấn – queries

dùng để hỏi về dữ liệu của đối tượng

các phương thức cập nhật – updates

thay đổi trạng thái của đối tượng (sửa đổi dữ liệu)

phương thức huỷ - destructor

dọn dẹp và thu hồi bộ nhớ khi huỷ một đối tượng

 

ppt19 trang | Chuyên mục: Lập Trình Hướng Đối Tượng | Chia sẻ: dkS00TYs | Lượt xem: 1673 | Lượt tải: 2download
Tóm tắt nội dung Bài giảng Lập trình hướng đối tượng - Các phương thức, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
Các phương thức Lập trình hướng đối tượng Tài liệu đọc Eckel, Bruce. Thinking in C++, 2nd Ed. Vol 1. Chapter 6: Initialization & Cleanup Chapter 11: References & the Copy Constructor p. 455 (The Copy Constructor) – p. 473 (Pointers to Members) Dietel. C++ How to Program, 4th Ed. Chapter 6: Classes and Data Abstraction From 6.9 to 6.16 Các loại phương thức cơ bản Đối tượng có thể có bốn kiểu hành vi cơ bản: tạo, truy vấn, cập nhật, và huỷ. Các loại phương thức có thể sử dụng để cài đặt các hành vi trên các phương thức tạo – constructors dùng để khởi tạo một thể hiện của lớp các phương thức truy vấn – queries dùng để hỏi về dữ liệu của đối tượng các phương thức cập nhật – updates thay đổi trạng thái của đối tượng (sửa đổi dữ liệu) phương thức huỷ - destructor dọn dẹp và thu hồi bộ nhớ khi huỷ một đối tượng Constructor Khi ta vừa khai báo biến thuộc các kiểu dữ liệu trong C++, giá trị chứa trong biến đó thường là không dự đoán trước được phải đảm bảo các giá trị đã được khởi tạo trước khi sử dụng. Tương tự đối với các lớp trong C++: phải khởi tạo giá trị cho các thành viên dữ liệu của một thể hiện trước khi bắt đầu sử dụng các phương thức của thể hiện đó Constructor là một loại phương thức đặc biệt dùng để khởi tạo thể hiện của lớp Bất kể loại cấp phát bộ nhớ nào được sử dụng (tự động, tĩnh, động), mỗi khi một thể hiện của lớp được tạo, một hàm constructor nào đó của lớp sẽ được gọi Constructor Constructor Những điều cần chú ý về constructor: Constructor không có giá trị trả về (kể cả void) chỉ để cung cấp mã khởi tạo cho các thể hiện của một lớp nếu cần thông báo lỗi, có các cơ chế khác mà ta sẽ nói đến sau Constructor có thể được khai báo chồng như các hàm C++ thông thường khác như vậy, có thể cung cấp các kiểu khởi tạo khác nhau tuỳ theo các đối số được cho khi tạo thể hiện Bây giờ ta sẽ bàn về một số loại constructor khác nhau Constructor mặc định Constructor mặc định (default constructor) là constructor được gọi khi thể hiện được khai báo mà không có đối số nào được cung cấp MyClass x; MyClass* p = new MyClass; Cả hai lệnh trên sẽ gọi constructor mặc định của MyClass (từ khoá new thực hiện hai việc: cấp phát bộ nhớ và gọi constructor) Ngược lại, nếu tham số được cung cấp tại khai báo thể hiện, trình biên dịch sẽ gọi phương thức constructor khác (overload) MyClass x(5); MyClass* p = new MyClass(5); Cả hai lệnh trên sẽ gọi một constructor yêu cầu tham số duy nhất là một số Khai báo các constructor Constructor luôn có tên trùng với tên lớp Do không trả về giá trị, ta khai báo constructor như các phương thức khác nhưng bỏ qua kiểu giá trị trả về class Foo { public: Foo(); 	// Default constructor Foo(int x); 	// Overloaded constructor Foo(string s); 	// Overloaded constructor … }; constructor cũng có thể cung cấp đối số mặc định do đó, một constructor có giá trị mặc định cho tất cả các tham số cũng là một constructor mặc định 	Foo(int x = 5);	// default constructor Constructor Constructor được định nghĩa như các phương thức khác, ngoại trừ việc ta bỏ qua kiểu trả về Không có giới hạn cho công việc khởi tạo của constructor (ta có thể làm nhiều hơn là chỉ gán các giá trị khởi tạo) ví dụ, có thể mở một file và đọc các giá trị khởi tạo từ file đó Không thể gọi các constructor một cách tường minh, chúng được gọi tự động mỗi khi một thể hiện được tạo Foo::Foo() { this->x = 10; } Foo::Foo(int x) { this->x = x } Constructor Đối với constructor mặc định, nếu ta không cung cấp một phương thức constructor nào, C++ sẽ tự sinh constructor mặc định là một phương thức rỗ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ếu ta khô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ếu ta không cung cấp tham số khi tạo thể hiện. Copy constructor Copy constructor là constructor đặc biệt được gọi khi ta tạo đối tượng mới là bản sao của một đối tượng đã có sẵn MyClass x(5); MyClass y = x;	hoặc	 MyClass y(x); C++ cung cấp sẵn một copy constructor, nó chỉ đơn giản copy từng thành viên dữ liệu từ đối tượng cũ sang đối tượng mới. Tuy nhiên, trong nhiều trường hợp, ta cần thực hiện các công việc khởi tạo khác trong copy constructor Thí dụ: lấy giá trị cho một ID duy nhất từ đâu đó, hoặc thực hiện sao chép “sâu” (chẳng hạn khi một trong các thành viên là con trỏ giữ bộ nhớ cấp phát động) Trong trường hợp đó, ta có thể định nghĩa lại copy constructor Copy constructor Khai báo cho copy constructor của lớp Foo: 	Foo(const Foo& existingFoo); tham số là đối tượng được sao chép Kiểu tham số là tham chiếu đến đối tượng kiểu Foo từ khoá const được dùng để đảm bảo đối tượng được sao chép sẽ không bị sửa đổi Destructor Cũng như một phương thức constructor được gọi khi một đối tượng được tạo, loại phương thức thứ hai, destructor, được gọi ngay trước khi thu hồi một đối tượng Do đó, destructor được tự động gọi khi một đối tượng là biến tự động ra khỏi phạm vi, khi một đối tượng được cấp phát động được xoá (sử dụng delete) hoặc khi chương trình kết thúc. Destructor thường được dùng để thực hiện mọi việc dọn dẹp cần thiết trước khi một đối tượng bị huỷ chẳng hạn xoá các thành viên dữ liệu là các đối tượng được cấp phát động Destructor Destructor không có giá trị trả về, và không thể định nghĩa lại (nó không bao giờ có tham số) Như vậy, mỗi lớp chỉ có 1 destructor Phương thức destructor trùng tên với tên lớp nhưng có dấu ~ đặt trước khai báo destructor của Foo sẽ là ~Foo(); Cũng như đối với constructor mặc định, nếu ta không cung cấp destructor, C++ sẽ tự sinh một destructor rỗng (không làm gì) Truy vấn Các phương thức truy vấn (query method, accessor) là các phương thức dùng để hỏi về giá trị của các thành viên dữ liệu của một đối tượng Có nhiều loại câu hỏi truy vấn có thể: truy vấn đơn giản (“giá trị của x là bao nhiêu?”) truy vấn điều kiện (“thành viên x có lớn hơn 10 không?”) truy vấn dẫn xuất (“tổng giá trị của các thành viên x và y là bao nhiêu?”) Đặc điểm quan trọng của phương thức truy vấn là nó không nên thay đổi trạng thái hiện tại của đối tượng không thay đổi giá trị của thành viên dữ liệu nào. Truy vấn Đối với các truy vấn đơn giản, quy ước đặt tên phương thức: tiền tố “get”, tiếp theo là tên của thành viên 	// query returns value of member x int getX();	 	// query returns value of member size int getSize(); Các loại truy vấn khác nên có tên có tính mô tả Truy vấn điều kiện nên có tiền tố “is” int Foo::getXPlusY() { return x + y; } bool Foo::isXPositive() { return x > 0; } Cập nhật Ngược lại với truy vấn, các phương thức cập nhật thường thay đổi trạng thái của đối tượng bằng cách sửa đổi một hoặc nhiều thành viên dữ liệu của đối tượng đó Dạng đơn giản nhất của các phương thức cập nhật là gán một giá trị nào đó cho một thành viên dữ liệu, các dạng khác có thể thực hiện các tính toán phức tạp hơn. Đối với dạng cập nhật đơn giản, quy ước đặt tên : dùng tiền tố “set” kèm theo tên thành viên cần sửa. Ví dụ: int setX(int); // update the value of member x Cập nhật Nếu các phương thức get/set chỉ có nhiệm vụ cho ta đọc và ghi giá trị cho các thành viên dữ liệu, quy định các thành viên private để được ích lợi gì? Ngoài việc bảo vệ các nguyên tắc đóng gói, ta còn cần kiểm tra xem giá trị mới cho thành viên dữ liệu có hợp lệ hay không ví dụ, cần đảm bảo rằng điểm trung bình của sinh viên không bị gán về số âm. Sử dụng phương thức truy vấn cho phép ta thực hiện việc kiểm tra trước khi thực sự thay đổi giá trị của thành viên. Cập nhật – Ví dụ Ví dụ: lớp Student có thành viên GPA (điểm trung bình) int Student::setGPA(double newGPA) { if ((newGPA >= 0.0) && (newGPA gpa = newGPA; return 0; 	// Return 0 to indicate success } else { return -1; 	// Return -1 to indicate failure } } 

File đính kèm:

  • pptBài giảng Lập trình hướng đối tượng - Các phương thức.ppt
Tài liệu liên quan