Chương 7 Các kiểu dữ liệu trừu tượng
7.2. Định nghĩa kiểu dữ liệu trừu tượng bằng cấu trúc class
7.2.3. Hàm khởi tạo và hàm hủy
Hình 7.5 là phiên bản mở rộng của cài đặt lớp Time trong Hình 7.4 (các phần
<...> trong Hình 7.5 có nội dung giống như đoạn tương ứng trong Hình 7.4).
Ngồi thành viên dữ liệu note, trong Hình 7.5 cịn có thêm các hàm đặc biệt là
Time(),Time(int h, int m, int s) và ~Time(). Các hàm có tên Time được
gọi là hàm khởi tạo (constructor), còn ~Time được gọi là hàm hủy (destructor).
Hàm khởi tạo là hàm thành viên đặc biệt có chức năng khởi tạo các thành viên
dữ liệu của đối tượng. Nó được gọi một cách tự động khi đối tượng được tạo, ví dụ khi một biến thuộc lớp đối tượng, chẳng hạn hàm khởi tạo Time() được gọi khi lệnh khai báo midnightTime được thực thi. Hàm khởi tạo phải trùng tên với tên lớp, khơng có giá trị trả về, và khơng có kiểu giá trị trả về. Một lớp có thể có vài hàm khởi tạo hoạt động theo nguyên tắc hàm trùng tên. Khi một đối tượng được tạo, trình biên dịch sẽ chọn gọi hàm nào có danh sách tham số khớp với các đối số được cho tại lệnh khai báo đối tượng. Trong Hình 7.5, đối tượng
dinnerTime được khai báo với 3 đối số, cho nên hàm khởi tạo Time (int h,
int m, int s) sẽ được tự động gọi khi chạy lệnh khao báo biến dinnerTime.
Trong khi đó, biến midnight được khai báo khơng có đối số, nên hàm khởi tạo Time() không yêu cầu tham số sẽ được tự động gọi khi chạy lệnh khao báo biến midnight.
Hàm hủy, ví dụ ~Time(), thực hiện chức năng ngược lại với hàm khởi tạo. Nó
được gọi tự động khi một đối tượng bị hủy khi thời gian sống của nó đã kết thúc hoặc khi nó là một đối tượng được cấp phát bộ nhớ động và đang được giải phóng khỏi bộ nhớ bằng lệnh delete. Hàm hủy phải trùng tên với tên lớp
nhưng có thêm dấu ngã (~) đặt trước. Hàm hủy khơng được có kết quả trả về. Đối với một đối tượng có thành viên dữ liệu là bộ nhớ động được cấp phát trong thời gian sống của đối tượng, hàm hủy là nơi thích hợp để viết các lệnh giải phóng phần bộ nhớ được cấp phát đó, mà đoạn lệnh này sẽ được thực hiện tại thời điểm mà đối tượng bị hủy. Trong Hình 7.5, hàm hủy ~Time chứa một lệnh giải phóng bộ nhớ động mà thành viên dữ liệu note trỏ tới. Công việc này sẽ được thực hiện đối với từng đối tượng midnight và dinnerTime khi chương
Cả hai loại hàm hủy và hàm tạo đều không bắt buộc. Nếu khơng được định nghĩa, trình biên dịch sẽ tự tạo các hàm tạo và hủy mặc định có nội dung rỗng.
#include <cstring> #include <iostream> using namespace std;
class Time { public:
Time () { //default constructor hour = minute = second = 0; note = 0;
}
Time (int h, int m, int s, const char* n) { setTime(h, m, s);
note = new char [strlen(n) + 1]; strcpy (note, n);
}
~Time () { delete [] note; } //destructor bool setTime (int h, int m, int s) { <...> } void print () {
cout << hour << ":" << minute << ":" << second; if (note != 0) cout << " (" << note << ")";
} private:
int hour; // 0-23 (24-hour clock format) int minute; // 0-59 int second; // 0-59
char* note;
bool isValid (int h, int m, int s) { <...> } };
int main() {
Time dinnerTime (19, 30, 0, "first date"); Time midnight;
cout << "Dinner will be held at "; dinnerTime.print();
cout << endl << "Light will be switched off at "; midnight.print();
return 0; }