Không static
may từ khóa có một vài ý nghĩa không liên quan khác nhau trong C ++
Khi được sử dụng cho các thành viên dữ liệu, điều đó có nghĩa là dữ liệu đó là phân bổ trong lớp chứ không phải trong các trường hợp.
Khi được sử dụng cho dữ liệu bên trong một chức năng, điều đó có nghĩa là dữ liệu được phân bổ tĩnh, khởi tạo lần đầu tiên khối được nhập và tồn tại cho đến khi chương trình thoát. Ngoài ra biến chỉ hiển thị bên trong hàm. Tính năng đặc biệt này của các thống kê địa phương thường được sử dụng để thực hiện việc xây dựng các singletons lười biếng.
Khi được sử dụng ở cấp đơn vị biên dịch (mô-đun), điều đó có nghĩa là biến đó giống như toàn cục (nghĩa là được phân bổ và khởi tạo trước main
được chạy và hủy sau khi main
thoát) nhưng biến đó sẽ không thể truy cập hoặc hiển thị trong các đơn vị biên dịch khác .
Tôi đã thêm một số nhấn mạnh vào phần quan trọng nhất cho mỗi lần sử dụng. Sử dụng (3) có phần không được khuyến khích trong các không gian tên không tên cũng cho phép khai báo lớp chưa xuất.
Trong mã của bạn, static
từ khóa được sử dụng với nghĩa số 2 và không liên quan gì đến các lớp hoặc thể hiện ... đó là một biến của hàm và sẽ chỉ có một bản sao của nó.
Như chính xác, iammilind đã nói tuy nhiên có thể có nhiều trường hợp của biến đó nếu hàm là hàm mẫu (vì trong trường hợp đó thực sự chính hàm đó có thể có trong nhiều bản sao khác nhau trong chương trình). Ngay cả trong trường hợp đó, các lớp và các khóa học không liên quan ... xem ví dụ sau:
#include <stdio.h>
template<int num>
void bar()
{
static int baz;
printf("bar<%i>::baz = %i\n", num, baz++);
}
int main()
{
bar<1>(); // Output will be 0
bar<2>(); // Output will be 0
bar<3>(); // Output will be 0
bar<1>(); // Output will be 1
bar<2>(); // Output will be 1
bar<3>(); // Output will be 1
bar<1>(); // Output will be 2
bar<2>(); // Output will be 2
bar<3>(); // Output will be 2
return 0;
}
static int i
cụ thể của thể hiện, ví dụ như vậyo1.foo(); // i = 1
và$o2.foo(); // i = 1
...?