Storage class** định nghĩa scope (phạm vi) và lifetime (vòng đời) của biến/hàm trong chương trình C++. Các specifier đứng trước kiểu họ sửa đổi. Có 5 storage class:
autoregisterstaticexternmutable
Chi tiết từng lớp
1. auto
C: khai báo biến automatic storage (mặc định trong block). Biến hủy khi thoát block. Thường thừa thãi.
C++11: suy diễn kiểu tự động từ initializer (auto x = 42; → int).
2. register
C: gợi ý compiler lưu biến trong register CPU (tối ưu tốc độ). Compiler có thể bỏ qua. Hiếm khi dùng.
C++: Từ khóa dự trữ không dùng, giữ để tương thích C. C++17 deprecated.
3. static
- Biến cục bộ: Tồn tại suốt vòng đời chương trình, giữ giá trị giữa các lần gọi hàm. Khởi tạo 1 lần.
- Biến toàn cục: Giới hạn phạm vi trong file (internal linkage).
- Thành viên class: Chia sẻ 1 bản sao cho tất cả đối tượng.
4. extern
Khai báo đối tượng dùng chung cho nhiều file nguồn. Không định nghĩa, chỉ khai báo. Định nghĩa thực tế ở một file khác.
// header.h
extern int globalVar;
// file1.cpp
int globalVar = 42; // Định nghĩa
// file2.cpp
#include "header.h"
void use() { globalVar++; } // S dụng chung
5. mutable
Chỉ dùng cho thành viên dữ liệu class. Cho phép sửa đổi thành viên đó ngay khi đối tượng là const. Không dùng với static, const, reference member.
class A {
mutable int cache; // Có thể sửa trong const method
int value;
public:
int getValue() const {
if (cacheValid) return cache;
cache = compute(); // OK vì mutable
cacheValid = true;
return cache;
}
};
Bảng tóm tắt
| Storage Class | Scope | Lifetime | Linkage |
|---|---|---|---|
auto (C++11: type deduction) |
Block | Block | No linkage |
register |
Block | Block | No linkage |
static (local) |
Block | Program | No linkage |
static (global) |
File | Program | Internal |
extern |
File/Program | Program | External |
mutable (member) |
Class | Object | N/A |