Bài 7: Hàm kiến tạo công cụ khác Giảng viên: Hồng Thị Điệp Khoa Cơng nghệ Thơng tin – ĐH Công Nghệ Chapter Constructors and Other Tools Copyright © 2010 Pearson Addison-Wesley All rights reserved Mục tiêu học • Hàm kiến tạo – Định nghĩa – Cách gọi • Một số cơng cụ – Từ khóa const cho tham số – Hàm inline – Thành viên liệu static • vector – Giới thiệu lớp vector DTH INT2202 Hàm kiến tạo • Khởi tạo đối tượng – Khởi tạo vài hay tất biến thành viên – Có thể thực thêm cơng việc khác • Một kiểu hàm thành viên đặc biệt – Được gọi tự động đối tượng khai báo • Cơng cụ hữu ích – Ngun lý LTHĐT DTH INT2202 Định nghĩa hàm kiến tạo • Hàm kiến tạo định nghĩa giống hàm thành viên khác – Ngoại trừ: Nó phải có tên giống hệt tên lớp Khơng thể trả giá trị; kể void! DTH INT2202 Ví dụ định nghĩa hàm kiến tạo • Định nghĩa lớp với hàm kiến tạo: class DayOfYear { public: DayOfYear(int monthValue, int dayValue); //Hàm kiến tạo khởi tạo month & day void input(); void output(); private: int month; int day; } DTH INT2202 Lưu ý hàm kiến tạo • Tên hàm kiến tạo: DayOfYear – Trùng tên lớp • Trong khai báo hàm kiến tạo không định kiểu trả – Kể kiểu void • Hàm kiến tạo nằm vùng public – Nó gọi đối tượng khai báo – Nếu private, khai báo đối tượng DTH INT2202 Gọi tới hàm kiến tạo • Khai báo đối tượng: DayOfYear date1(7, 4), date2(5, 5); • Các đối tượng tạo – Hàm kiến tạo gọi – Các giá trị cặp ngoặc tròn truyền làm số hàm kiến tạo – Các biến thành viên month, day khởi tạo: date1.month date2.month date1.day date2.day DTH INT2202 Thử lời gọi tương đương • Xét: DayOfYear date1, date2 date1.DayOfYear(7, 4); // không hợp lệ! date2.DayOfYear(5, 5); // khơng hợp lệ! • Có vẻ ổn… – KHÔNG thể gọi tới hàm kiến tạo cách bạn gọi tới hàm thành viên! DTH INT2202 Mã nguồn hàm kiến tạo • Định nghĩa hàm kiến tạo giống định nghĩa hàm thành viên khác: DayOfYear::DayOfYear(int monthValue, int dayValue) { month = monthValue; day = dayValue; } • Chú ý tên giống bên :: – Nhận diện rõ ràng hàm kiến tạo • Chú ý khơng có kiểu trả – Nhất quán với định nghĩa lớp DTH INT2202 Thành viên static • Biến thành viên static – Tất đối tượng lớp “dùng chung” – Một đối tượng biến đổi tất chịu tác động • Hữu ích cho việc “theo dõi” – Một hàm thành viên gọi lần – Có đối tượng tồn • Trong khai báo, đặt từ khóa static trước kiểu DTH INT2202 Hàm static • Hàm thành viên static – Nếu không cần truy cập đến liệu đối tượng – Và “phải” thành viên lớp – Thì định hàm static • Có thể gọi từ bên ngồi lớp – Khơng qua đối tượng lớp: • Ví dụ: Server::getTurn(); – Thơng qua đối tượng lớp • Cách chuẩn: myObject.getTurn(); • Chỉ sử dụng liệu/hàm static! DTH INT2202 Ví dụ thành viên static: Display 7.6 Thành viên static (1/4) DTH INT2202 Ví dụ thành viên static: Display 7.6 Thành viên static (2/4) DTH INT2202 Ví dụ thành viên static: Display 7.6 Thành viên static (3/4) DTH INT2202 Ví dụ thành viên static: Display 7.6 Thành viên static (4/4) DTH INT2202 vector • Giới thiệu vector – Nhắc lại: mảng tĩnh có kích thước khơng đổi – vector: “là kiểu mảng có kích thước thay đổi” • q trình thực thi chương trình – Định nghĩa Thư Viện Khuôn Mẫu Chuẩn Standard Template Library (STL) • Dùng template lớp DTH INT2202 Căn vector • Tương tự mảng: – Có kiểu sở cho phần tử – Lưu tập giá trị thuộc kiểu sở • Nhưng cách khai báo khác: – Cú pháp: vector • Là dấu hiệu khn mẫu lớp • Bất kiểu liệu đặt vào vị trí Kiểu_Cơ_Sở • Tạo lớp vector “mới” cho kiểu sở định – Ví dụ khai báo: vector v; so sanh voi int a[100]; DTH INT2202 Sử dụng vector • vector v; – "v vector kiểu int" – Gọi tới hàm kiến tạo mặc định • tạo đối tượng vector rỗng • Đánh số để truy cập giống mảng • Nhưng để thêm phần tử: – Phải gọi tới hàm thành viên push_back • Hàm thành viên size() – Trả số phần tử thời DTH INT2202 Ví dụ vector: Display 7.7 Sử dụng vector (1/2) DTH INT2202 Ví dụ vector: Display 7.7 Sử dụng vector (2/2) DTH INT2202 Tính hiệu vector • Hàm thành viên capacity() – Trả dung lượng nhớ cấp phát cho đối tượng – Khơng giống size() – Thường capacity > size • Tự động tăng cần • Nếu quan tâm đến tính hiệu quả: – Có thể thiết lập cách xử lý dung lượng thủ cơng • v.reserve(32); //đặt capacity 32 • v.reserve(v.size()+10); // đặt capacity 10 cộng với size DTH INT2202 Tóm tắt • Hàm kiến tạo: tự động khởi tạo liệu lớp – Được gọi khai báo đối tượng – Hàm kiến tạo trùng tên với lớp • Hàm kiến tạo mặc định khơng có đối số – Nên ln định nghĩa • Biến thành viên lớp – Có thể đối tượng lớp khác • Cần có phần khởi tạo hàm kiến tạo DTH INT2202 Tóm tắt • Tham số tham chiếu – Hiệu truyền giá trị • Có thể viết inline hàm ngắn – Có thể cải thiện hiệu • Biến thành viên static – Được dùng chung tất đối tượng lớp • Các lớp vector – Giống như: “mảng lớn lên hay nhỏ đi" DTH INT2202 Chuẩn bị tới • Đọc chương giáo trình: Nạp chồng tốn tử, Từ khóa friend Tham chiếu DTH INT2202