Giới thiệu
Trong bài viết trước, chúng ta đã tìm hiểu về "CHUỖI KÝ TỰ TRONG C++" (std::string) và về cơ bản của nó.
Hôm nay, tôi sẽ hướng dẫn về "Biến cục bộ trong C++ (Local variables)" và chia sẻ những kinh nghiệm khi sử dụng biến cục bộ trong lập trình.
Nội dung
Để hiểu rõ bài viết này, bạn nên có kiến thức cơ bản về "BIẾN TRONG C++ (Variables)".
Trong bài này, chúng ta sẽ cùng tìm hiểu về các vấn đề sau:
- Tổng quan về tầm vực của biến
- Biến cục bộ (Local variables)
Tổng quan về tầm vực của biến
Trong bài "BIẾN TRONG C++ (Variables)", bạn đã biết cách khai báo, khởi tạo và sử dụng một biến trong chương trình.
Khi chương trình được chạy, một vùng trong bộ nhớ RAM sẽ được cấp phát cho biến, ví dụ như biến nVarName. Tuy nhiên, câu hỏi đặt ra là "Khi nào vùng nhớ của biến nVarName trong RAM được giải phóng?". Bài viết này sẽ giúp bạn trả lời câu hỏi đó.
Khi nói về biến, có 2 khái niệm quan trọng bạn cần biết:
- Phạm vi của biến: Xác định nơi bạn có thể truy cập vào biến.
- Thời gian tồn tại của biến: Xác định nơi nó được tạo ra và bị hủy.
Phạm vi của biến được chia làm 2 loại:
- Biến cục bộ (Local variables)
- Biến toàn cục (Global variables)
Trong bài viết này, tôi sẽ chia sẻ với bạn về biến cục bộ và những kinh nghiệm khi sử dụng nó.
Biến cục bộ (Local variables)
"Biến được định nghĩa bên trong một khối lệnh (block)" được gọi là các "biến cục bộ (Local variables)".
- Các biến cục bộ có thời gian tự động, có nghĩa là chúng được tạo tại thời điểm định nghĩa, và bị hủy khi ra khỏi khối lệnh mà biến đó được định nghĩa.
- Các biến cục bộ có phạm vi bên trong khối lệnh (còn được gọi là phạm vi cục bộ), nghĩa là sẽ không truy cập được biến khi ở bên ngoài khối lệnh.
Ví dụ:
int main() {
int n(6); // n được tạo và khởi tạo tại đây
double d(9.0); // d được tạo và khởi tạo tại đây
cout "Nhập một giá trị cho n: ";
cin >> n;
cout "Bạn đã nhập: " n endl;
return 0;
}
Trong ví dụ trên, n và d là hai biến được định nghĩa bên trong hàm main()
, và hai biến này đều bị hủy khi hàm main()
kết thúc.
Vấn đề 1: Biến được định nghĩa bên trong khối lệnh lồng nhau bị hủy ngay sau khi các khối bên trong kết thúc.
Ví dụ:
int main() { // khối lệnh ngoài cùng
int n(6); // n được tạo và khởi tạo tại đây
{ // khối lệnh lồng
double d(9.0); // d được tạo và khởi tạo tại đây
} // d bị hủy và bị hủy tại đây, không thể sử dụng d ở đây vì nó đã bị hủy!
return 0;
} // n bị hủy tại đây
Vấn đề 2: Khối lệnh lồng nhau được coi là một phần của khối lệnh bên ngoài, nơi biến được định nghĩa. Do đó, các biến được định nghĩa trong khối lệnh bên ngoài có thể được nhìn thấy bên trong một khối lệnh lồng nhau.
Ví dụ:
int main() {
int x(6); // biến x được tạo và khởi tạo tại đây
{
int y(9); // biến y được tạo và khởi tạo tại đây
cout x " + " y " = " x + y;
} // biến y bị hủy tại đây, không thể sử dụng y ở đây vì nó đã bị hủy!
return 0;
} // biến x bị hủy tại đây
Vấn đề 3: Biến được định nghĩa bên trong một khối lệnh chỉ có thể được nhìn thấy trong khối lệnh đó.
Vì mỗi hàm có một khối lệnh riêng, các biến trong một hàm không thể được nhìn thấy từ một hàm khác.
Ví dụ:
void someFunction() {
int value(4); // value được định nghĩa ở đây, chỉ có thể nhìn thấy và sử dụng ở đây
}
int main() {
someFunction();
return 0;
}
Vấn đề 4: Hàm có thể có các biến hoặc các tham số với tên giống như các hàm khác. Nghĩa là bạn không cần phải lo lắng về việc đặt tên xung đột giữa hai hàm độc lập.
Trong ví dụ sau, cả hai hàm có các biến có tên là x và y. Các biến trong từng hàm không nhận thức được sự tồn tại của các biến khác có cùng tên trong các hàm khác.
#include
using namespace std;
// Biến x trong hàm add() chỉ có thể được nhìn thấy và sử dụng trong hàm add()
int add(int x, int y) {
return x + y;
}
int main() {
int x = 6; // biến x của hàm main()
int y = 9;
cout add(x, y) endl;
return 0;
}
Vấn đề 5: Một biến bên trong một khối lệnh lồng nhau có thể có cùng tên với một biến ở khối lệnh bên ngoài. Trong trường hợp này, biến của khối lệnh lồng sẽ "ẩn" biến bên ngoài. Nó được gọi là tên ẩn hoặc shadowing.
#include
using namespace std;
int main() {
int apples(6); // Biến apples của khối lệnh bên ngoài
if (apples >= 6) {
int apples; // Ẩn biến apples của khối lệnh bên ngoài
apples = 9; // Gán giá trị 9 cho biến apples của khối lệnh lồng
cout apples endl; // In giá trị biến apples của khối lệnh lồng
}
cout apples endl; // In giá trị biến apples của khối lệnh bên ngoài
return 0;
}
Vấn đề 6: Nếu một biến chỉ được sử dụng trong một khối lệnh lồng nhau, nó phải được định nghĩa bên trong khối lệnh lồng nhau.
#include
using namespace std;
int main() {
int y(6); // Chúng ta đang khai báo y ở đây vì chúng ta cần nó trong khối lệnh bên ngoài sau này
{
int x;
cin >> x;
// Nếu chúng ta khai báo y ở đây, ngay trước khi chúng ta sử dụng lần xuất hiện thực sự đầu tiên ...
if (x == 9)
y = 9; // ... thì nó sẽ bị hủy ở đây
}
cout y; // và chúng ta cần y tồn tại ở đây
return 0;
}
Nguyên tắc: Biến phải được định nghĩa trong phạm vi nhỏ nhất có thể.
Kết luận
Qua bài viết này, bạn đã nắm được Biến cục bộ trong C++ (Local variables) và những kinh nghiệm khi sử dụng biến cục bộ trong lập trình. Tôi tóm tắt lại 2 nội dung quan trọng mà bạn cần nắm trong bài viết này:
- Biến được định nghĩa bên trong khối lệnh được gọi là biến cục bộ (local variables). Những biến này chỉ có thể được truy cập bên trong các khối lệnh mà nó được định nghĩa (bao gồm các khối lệnh lồng nhau), và bị hủy ngay sau khi các khối lệnh kết thúc.
- Định nghĩa các biến trong phạm vi nhỏ nhất có thể. Nếu một biến chỉ được sử dụng trong một khối lệnh lồng nhau, nó phải được định nghĩa bên trong khối lệnh lồng nhau.
Ở bài viết tiếp theo, bạn sẽ được học về BIẾN TOÀN CỤC TRONG C++ (Global variables).
Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý để chúng tôi có thể phát triển bài viết tốt hơn.