Ở phạm vi tệp, không có sự khác biệt trong C++. const
làm cho liên kết nội bộ mặc định và tất cả các biến toàn cầu có tuổi thọ tĩnh. Nhưng biến thể đầu tiên có cùng một hành vi trong C, vì vậy đó có thể là một lý do chính đáng để sử dụng nó.
Trong một hàm, phiên bản thứ hai có thể được tính từ tham số, trong C hoặc C++ không phải là thời gian biên dịch giống như một số ngôn ngữ khác yêu cầu.
Trong lớp, về cơ bản giống như đối với các hàm, giá trị const
thể hiện có thể được tính trong ctor-initializer-list. A static const
được đặt trong khi khởi động khởi động và vẫn không thay đổi cho phần còn lại của chương trình. (Lưu ý: mã cho static
viên trông hơi khác một chút vì khai báo và khởi tạo được tách ra.)
Hãy nhớ rằng, trong C++, const
nghĩa read-only, không liên tục. Nếu bạn có một con trỏ tới const
thì các phần khác của chương trình có thể thay đổi giá trị trong khi bạn không tìm kiếm. Nếu biến được xác định bằng const
thì không ai có thể thay đổi sau khi khởi tạo nhưng việc khởi tạo vẫn có thể phức tạp tùy ý.
Nguồn
2010-09-14 13:22:19
'tĩnh' có lẽ là từ khóa bị quá tải nhiều nhất trong C++. Ý nghĩa của mã của bạn khác nhau tùy thuộc vào việc nó có ở phạm vi không gian tên, ở phạm vi lớp hay ở phạm vi chức năng. Bạn có thể muốn làm rõ điều đó. – sbi
@sbi: Tôi nghĩ tôi đã làm rồi. Phạm vi chức năng (nơi nó là một lớp lưu trữ specifier) và phạm vi tập tin (nơi nó là một specifier liên kết). Các thành viên lớp và các biến phạm vi không gian tên cụ thể không phải là mối quan tâm của tôi đối với câu hỏi này, mặc dù nếu có ai cảm thấy có một sự khác biệt thú vị, cũng có thể tự do che đậy điều đó. – Clifford
@Clifford: Tôi xin lỗi vì tôi đã bỏ qua những lời cuối cùng. Tuy nhiên, điều này cho thấy một sự hiểu lầm về phía bạn: Trong C++, phạm vi không gian tên tập tin _is_. Nếu bạn khai báo bất cứ điều gì ở bên ngoài của bất kỳ không gian tên nào, nó sẽ đơn giản thuộc về không gian tên _global (và có thể truy cập thông qua một tiền tố '::' không có định danh ở phía trước). Tôi không biết về bất kỳ sự khác biệt có ý nghĩa giữa không gian tên chung và bất kỳ không gian tên nào được lồng trong nó. Chắc chắn không có bất kỳ đối tượng 'tĩnh' nào. – sbi