1. Vấn đề nó giải quyết
Delegating constructor tái sử dụng constructor khác của cùng class; non-static member initializer đặt giá trị mặc định ngay cạnh khai báo member. Nó làm ràng buộc quan trọng hiện rõ thay vì bắt người đọc đoán. Bài chỉ giữ phần cốt lõi C++11 vừa đủ cho một ngày tập trung.
2. Kiến thức cần có
Kiến thức Ngày 21, cùng biến, hàm và cách đọc output đã học trước đó.
3. Ý tưởng cốt lõi
Mental model: Delegating constructor tái sử dụng constructor khác của cùng class; non-static member initializer đặt giá trị mặc định ngay cạnh khai báo member. Hãy xác định giá trị hoặc trạng thái liên quan, ai sở hữu nó và quy tắc tác động lúc compile hay lúc chạy.
4. Cú pháp tối thiểu
int port_ = 80; Config() : Config(80) {}5. Cách nó hoạt động
Ví dụ tạo dữ liệu nhỏ, cố định và không cần nhập bàn phím.
C++11 hoặc contract thư viện chuẩn áp dụng quy tắc hôm nay.
Chương trình in kết quả quan trọng để đối chiếu với mã nguồn.
6. Lỗi thường gặp
Delegating constructor không được đồng thời khởi tạo member khác trong initializer list; constructor đích chịu trách nhiệm việc đó.
7. Khi nào nên dùng
Nên dùng khi nhiều đường dựng đối tượng dùng chung một chính sách khởi tạo.
Tránh dùng khi nó che ownership, lifetime, kiểu, thứ tự hoặc chi phí.
8. Ví dụ đơn giản
Cấu hình mặc định delegate tới constructor nhận cổng, còn khai báo member cung cấp giá trị an toàn cho phần bị bỏ qua. File .cpp dùng dữ liệu cố định và không thêm abstraction ngoài chủ đề.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp11/22_delegating_constructors_non_static_member_initializers/main.cpp
#include <iostream>
class Config {
public:
Config() : Config(80) {} // delegates to the main constructor
explicit Config(int port) : port_(port) {}
void print() const {
std::cout << "port=" << port_ << " secure=" << secure_ << '\n';
}
private:
int port_ = 80; // non-static member initializer
bool secure_ = false;
};
int main() {
Config defaults;
Config custom(443);
defaults.print();
custom.print();
}
9. Điều cần nhớ
Tính năng nằm trong phạm vi C++11 của lộ trình này.
Hiểu hệ quả về lifetime, ownership, kiểu và thứ tự trước khi dùng.
Compile với cảnh báo và ưu tiên cách viết nhỏ nhất làm quy tắc hiện rõ.
10. Câu hỏi tự kiểm tra
Dễ —
Config() : Config(80) {}tái sử dụng constructor như thế nào? Khai báo memberbool secure_ = falsecung cấp giá trị mặc định ở đâu?Trung bình — Đọc ví dụ nhỏ ở trên. Chương trình sẽ in giá trị hoặc trạng thái nào, và quy tắc nào tạo ra kết quả đó?
Khó — Tìm và giải thích lỗi tinh tế trong tình huống sau: Delegating constructor không được đồng thời khởi tạo member khác trong initializer list; constructor đích chịu trách nhiệm việc đó. Cách sửa nhỏ nhất nhưng an toàn trong C++11 là gì?