Lớp lưu trữ static hướng dẫn trình biên dịch giữ một biến cục bộ tồn tại suốt vòng đời của chương trình thay vì tạo và hủy nó mỗi khi vào/ra khỏi phạm vi. Do đó, biến cục bộ static giữ nguyên giá trị giữa các lần gọi hàm.
Bộ sửa đổi static cũng có thể áp dụng cho biến toàn cului. Khi làm vậy, nó giới hạn phạm vi của biến đó chỉ trong file nơi nó được khai báo (liên kết nội bộ - internal linkage).
Trong C++, khi static được dùng trên thành viên dữ liệu của class, nó khiến chỉ có một bản sao của thành viên đó được chia sẻ bởi tất cả các đối tượng của class đó.
Ví dụ minh họa
#include <iostream>
void func(void) {
static int i = 10; // Biến cục bộ static
i++;
std::cout << "i is " << i;
std::cout << " and count is " << count << std::endl;
}
static int count = 6; // Biến toàn cục static (liên kết nội bộ)
int main() {
while(count--) {
func();
}
}
Kết quả đầu ra
i is 11 and count is 5
i is 12 and count is 4
i is 13 and count is 3
i is 14 and count is 2
i is 15 and count is 1
i is 16 and count is 0
Giải thích:
- Biến
itrongfunc()được khởi tạo một lần duy nhất (lần đầu gọi hàm) và giữ giá trị qua các lần gọi sau. - Biến
countlà toàn cụcstatic, chỉ nhìn thấy trong file này. - Vòng lặp chạy 6 lần (từ 5 xuống 0), mỗi lần
ităng 1.
Tóm tắt 3 trường hợp dùng static
| Ngữ cảnh | Hiệu quả |
|---|---|
| Biến cục bộ trong hàm | Giữ giá trị giữa các lần gọi, 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 (static member) | Chia sẻ 1 bản sao cho tất cả đối tượng của class |