Phạm vi (scope) là vùng chương trình mà biến được nhìn thấy. C++ có 3 loại chính:
1. Biến cục bộ (Local Variables)
- Khai báo trong hàm hoặc khối
{ ... }. - Chỉ truy cập được trong khối đó.
- Hủy khi ra khỏi khối (stack unwinding).
- Không tự khởi tạo – giá trị rác nếu không gán.
int main() {
int a = 10, b = 20; // cục bộ
int c = a + b;
cout << c; // 30
return 0;
}
2. Biến toàn cục (Global Variables)
- Khai báo ngoài mọi hàm (thường đầu file).
- Truy cập được mọi nơi sau khai báo.
- Sống suốt vòng đời chương trình.
- Tự khởi tạo 0 (hoặc
nullptr,'\0',0.0...).
int g; // toàn cục, tự = 0
int main() {
int a = 10, b = 20;
g = a + b;
cout << g; // 30
return 0;
}
3. Trùng tên biến cục bộ & toàn cục
Biến cục bộ che khuất (shadow) biến toàn cục cùng tên trong phạm vi cục bộ.
int g = 20;
int main() {
int g = 10; // cục bộ che toàn cục
cout << g; // in 10
return 0;
}
10
Để truy cập toàn cục bị che: ::g (toán tử phạm vi toàn cục).
4. Tham số hàm (Function Parameters)
- Coi như biến cục bộ của hàm.
- Truyền bằng giá trị: copy, thay đổi không ảnh hưởng đối số.
- Truyền bằng tham chiếu/con trỏ: sửa đổi đối số gốc.
Bảng khởi tạo mặc định
| Kiểu | Giá trị mặc định (toàn cục/static) |
|---|---|
| int, short, long... | 0 |
| float, double | 0.0 |
| char | '\0' |
| pointer | nullptr (NULL) |
| class/struct | default constructor |
Biến cục bộ không có giá trị mặc định – phải tự khởi tạo.
Phạm vi khối (Block Scope) – C++17
if (int x = getValue(); x > 0) { /* x visible here */ }
// x không còn tồn tại
switch (int y = foo(); y) { case 1: ... }
// y không còn tồn tại
Khuyến nghị
- Hạn chế biến toàn cục – dùng singleton, dependency injection, namespace.
- Khởi tạo biến cục bộ ngay tại khai báo:
int x = 0;. - Dùng
constcho biến không thay đổi. - Ưu tiên phạm vi hẹp nhất có thể (RAII).