<< Chapter < Page | Chapter >> Page > |
1: #include<iostream.h>
2: #include<string.h>
3: #include<assert.h>
4:
5: class Employee
6: {
7: public:
8: Employee(const char*, const char*); // Constructor
9: ~Employee(); // Destructor
10: char *GetFirstName() const; // Trả về first name
11: char *GetLastName() const; // Trả về last name
12: // Hàm thành viên tĩnh
13: static int GetCount(); // Trả về số đối tượng khởi tạo
14: private:
15: char *FirstName;
16: char *LastName;
17: // static data member
18: static int Count; // Số đối tượng khởi tạo
19: };
20:
21: // Khởi tạo thành viên dữ liệu tĩnh
22: int Employee::Count = 0;
23:
24://Định nghĩa hàm thành viên tỉnh mà trả về số đối tượng khởi tạo
25: int Employee::GetCount()
26: {
27: return Count;
28: }
29:
30: // Constructor cấp phát động cho first name và last name
31: Employee::Employee(const char *First, const char *Last)
32: {
33: FirstName = new char[ strlen(First) + 1 ];
34: assert(FirstName != 0); // Bảo đảm vùng nhớ được cấp phát
35: strcpy(FirstName, First);
36: LastName = new char[ strlen(Last) + 1 ];
37: assert(LastName != 0); // Bảo đảm vùng nhớ được cấp phát
38: strcpy(LastName, Last);
39: ++Count; // Tăng số đối tượng lên 1
40: cout<<"Employee constructor for "<<FirstName
41: <<' '<<LastName<<" called."<<endl;
42: }
43:
44: // Destructor giải phóng vùng nhớ đã cấp phát
45: Employee::~Employee()
46: {
47: cout<<"~Employee() called for "<<FirstName
48: <<' '<<LastName<<endl;
49: delete FirstName;
50: delete LastName;
51: --Count; // Giảm số đối tượng xuống 1
52: }
53:
54: // Trả về first name
55: char *Employee::GetFirstName() const
56: {
57: char *TempPtr = new char[strlen(FirstName) + 1];
58: assert(TempPtr != 0); // Bảo đảm vùng nhớ được cấp phát
59: strcpy(TempPtr, FirstName);
60: return TempPtr;
61: }
62:
63: // Trả về last name
64: char *Employee::GetLastName() const
65: {
66: char *TempPtr = new char[strlen(LastName) + 1];
67: assert(TempPtr != 0); // Bảo đảm vùng nhớ được cấp phát
68: strcpy(TempPtr, LastName);
69: return TempPtr;
70: }
71:
72: int main()
73: {
74: cout<<"Number of employees before instantiation is "
75: <<Employee::GetCount()<<endl; // Sử dụng tên lớp
76: Employee *E1Ptr = new Employee("Susan", "Baker");
77: Employee *E2Ptr = new Employee("Robert", "Jones");
78: cout<<"Number of employees after instantiation is "
79: <<E1Ptr->GetCount()<<endl;
80: cout<<endl<<"Employee 1: "
81: <<E1Ptr->GetFirstName()
82: <<" "<<E1Ptr->GetLastName()
83: <<endl<<"Employee 2: "
84: <<E2Ptr->GetFirstName()
85: <<" "<<E2Ptr->GetLastName()<<endl<<endl;
86: delete E1Ptr;
87: delete E2Ptr;
88: cout<<"Number of employees after deletion is "
89: <<Employee::GetCount()<<endl;
90: return 0;
91: }
Thành viên dữ liệu Count được khởi tạo là zero ở phạm vi file với lệnh:
int Employee::Count = 0;
Thành viên dữ liệu Count duy trì số các đối tượng của lớp Employee đã được khởi tạo. Khi đối tượng của lớp Employee tồn tại, thành viên Count có thể được tham chiếu thông qua bất kỳ hàm thành viên nào của một đối tượng Employee – trong ví dụ này, Count được tham chiếu bởi cả constructor lẫn destructor. Khi các đối tượng của lớp Employee không tồn tại, thành viên Count có thể vẫn được tham chiếu nhưng chỉ thông qua một lời gọi hàm thành viên tĩnh public GetCount() như sau:
Notification Switch
Would you like to follow the 'Lập trình hướng đối tượng' conversation and receive update notifications?