1. Vấn đề nó giải quyết
Scope quyết định nơi nhìn thấy tên; storage duration quyết định vùng nhớ tồn tại bao lâu; lifetime quyết định lúc nào đối tượng được phép sử dụng. 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 2, cùng biến, hàm và cách đọc output đã học trước đó.
3. Ý tưởng cốt lõi
Mental model: Scope quyết định nơi nhìn thấy tên; storage duration quyết định vùng nhớ tồn tại bao lâu; lifetime quyết định lúc nào đối tượng được phép sử dụng. 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 local = 1; } // local is visible and alive only in this block5. 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
Trả về địa chỉ hoặc reference của biến local tự động sẽ để lại truy cập bị treo sau khi hàm kết thúc.
7. Khi nào nên dùng
Nên dùng khi cần biết tên có nhìn thấy được không và đối tượng còn sống hay không.
Tránh dùng khi nó che ownership, lifetime, kiểu, thứ tự hoặc chi phí.
8. Ví dụ đơn giản
Biến local trong block kết thúc ở dấu ngoặc đóng, còn bộ đếm static trong hàm giữ giá trị qua nhiều lần gọi. 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/03_scope_storage_duration_object_lifetime/main.cpp
#include <iostream>
int next_call() {
static int calls = 0; // storage lasts for the whole program
return ++calls;
}
int main() {
int outer = 10;
{
int inner = 5; // automatic lifetime ends with this block
std::cout << "inside=" << outer + inner << '\n';
}
std::cout << "calls=" << next_call() << ',' << next_call() << '\n';
}
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ễ — Scope, storage duration và lifetime khác nhau thế nào? Dùng biến
int local = 1trong một khối{ ... }để minh họa.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: Trả về địa chỉ hoặc reference của biến local tự động sẽ để lại truy cập bị treo sau khi hàm kết thúc. Cách sửa nhỏ nhất nhưng an toàn trong C++11 là gì?