Hàm thành phần của lớp được khai báo với từ khoá const đứng ngay sau danh sách các tham số hình thức được gọi là hàm thành phần const.
Hàm thành phần const thì không thể thay đổi nội dung một đối tượng. Một hàm thành phần const phải được mô tả cả trong khai báo và khi định nghĩa. Hàm thành phần const có thể được định nghĩa chồng bằng một hàm khác không phải const.
Lưu ý: Hàm thành viên const có thể được đa năng hóa với một phiên bản non-const. Việc
lựa chọn hàm thành viên đa năng hóa nào để sử dụng được tạo một cách tự động bởi trình biên dịch dựa vào nơi mà đối tượng được khai báo const hay không.
Một đối tượng const không thể được thay đổi bởi phép gán vì thế nó phải được khởi động. Khi một thành viên dư liệu của một lớp được khai báo const, một bộ khởi tạo thành viên
(member initializer) phải được sử dụng để cung cấp cho constructor với giá trị ban đầu của thành viên dư liệu đối với một đối tượng của lớp.
.VII LỚP NHƯ LÀ CÁC THÀNH VIÊN CỦA CÁC LỚP KHÁC
Một lớp có thể có các đối tượng của các lớp khác như các thành viên. Khi một đối tượng đi vào phạm vi, constructor của nó được gọi một cách tự động, vì thế chúng ta cần mô tả các tham số được truyền như thế nào tới các constructor của đối tượng thành viên. Các đối tượng thành viên được xây dựng theo thứ tự mà trong đó chúng được khai báo (không theo thứ tự mà chúng được liệt kê trong danh sách bộ khởi tạo thành viên của constructor) và trước các đối tượng của lớp chứa đựng chúng được xây dựng.
Ví dụ 3.9: Lớp Date là thành viên của lớp Employee.
#include <iostream.h> #include <string.h> class Date
{public:
Date(int = 1, int = 1, int = 1900); //Constructor mặc định void Print() const; //In ngày theo dạng Month/Day/Year private:
int Month; //1-12 int Day; //1-31
int Year; //Năm bất ky
//Hàm tiện ích để kiểm tra Day tương thích đối với Month và Year int CheckDay(int);
};
class Employee {public:
Employee(char *, char *, int, int, int, int, int, int); void Print() const;
private: char LastName[25]; char FirstName[25]; Date BirthDate; Date HireDate; };
//Constructor: xác nhận giá trị tương thích của Month
//Gọi hàm CheckDay() để xác nhậ?n giá trị tương thích của Day Date::Date(int Mn, int Dy, int Yr)
{if (Mn > 0 && Mn <= 12) Month = Mn;
else
{ Month = 1;
cout << "Month " << Mn << " invalid. Set to Month 1."<< endl; } Year = Yr;
Day = CheckDay(Dy);
cout << "Date object constructor for date "; Print();
cout << endl; }
//Hàm tiện ích để xác nhận giá trị Day tương thích dựa vào Month và Year int Date::CheckDay(int TestDay)
{
static int DaysPerMonth[13]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30,31, 30, 31}; if (TestDay > 0 && TestDay <= DaysPerMonth[Month])
return TestDay;
return TestDay;
cout << "Day " << TestDay << "invalid. Set to Day 1." << endl; return 1;
}
//In đối tượng Date dạng Month/Day/Year void Date::Print() const
{ cout << Month << '/' << Day << '/' << Year; }
Employee::Employee(char *FName, char *LName,int BMonth, int BDay, int BYear,int HMonth, int HDay, int HYear)
:BirthDate(BMonth, BDay, BYear), HireDate(HMonth, HDay, HYear) {//Sao chép FName vào FirstName và phải chắc chắn rằng nó phù hợp int Length = strlen(FName);
Length = Length < 25 ? Length : 24; strncpy(FirstName, FName, Length); FirstName[Length] = '\0';
//Sao chép LName vào LastName và phải chắc chắn rằng nó phù hợp Length = strlen(LName);
Length = Length < 25 ? Length : 24; strncpy(LastName, LName, 24);
LastName[Length] = '\0';
cout << "Employee object constructor: "<< FirstName <<' '<< LastName << endl; }
void Employee::Print() const
{cout << LastName << ", " << FirstName << endl << "Hired: "; HireDate.Print();
cout << " Birthday: "; BirthDate.Print(); cout << endl; } int main()
{Employee E("Bob", "Jones", 7, 24, 49, 3, 12, 88); cout << endl;
E.Print();
cout << endl << "Test Date constructor with invalid values:" << endl; Date D(14, 35, 94); //Các giá trị Date không hợp lệ
return 0; }
Lưu ý: Một đối tượng thành viên không cần được khởi tạo thông qua một bộ khởi tạo
thành viên. Nếu một bộ khởi tạo thành viên không được cung cấp, constructor mặc định của
đối tượng thành viên sẽ được gọi một cách tự động.
.VIII CÁC THÀNH PHẦN TĨNH CỦA LỚP