2010-09-14 41 views
109

Trong C++ đặc biệt, sự khác biệt về ngữ nghĩa giữa ví dụ là gì:C++ ngữ nghĩa của `const` tĩnh vs 'const`

static const int x = 0 ; 

const int x = 0 ; 

cho cả static như một liên kết và một lưu trữ lớp specifier (tức là bên trong và bên ngoài một chức năng).

+6

'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

+1

@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

+0

@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

Trả lời

101

Ở 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 ý.

+1

Có điều gì gọi là phạm vi tệp không? Tôi chỉ kiểm tra 3,3 đô la và tôi nghĩ gần nhất là 'phạm vi không gian tên'. Sự hiểu biết của tôi có đúng không? Tiêu chuẩn C++ 03 chỉ đề cập đến phạm vi tập tin trong các Phụ lục – Chubsdad

+0

Không sử dụng thuật ngữ "phạm vi không gian tên" vì loại đó xuất hiện trên một ốp của cách các thành viên của hầu hết các không gian tên có liên kết bên ngoài theo mặc định, nhưng các thành viên của không gian tên ẩn danh có liên kết nội bộ. Mà không có gì để làm với một câu hỏi về 'tĩnh' ngoại trừ việc nó làm cho tĩnh cho kiểm soát liên kết lỗi thời. –

+1

Tôi sẽ đề nghị rằng * phạm vi tập tin * là một artefact của mối liên kết chứ không phải là trình biên dịch, vì vậy có thể không nhận được nhiều sự chú ý trong tiêu chuẩn ngôn ngữ. Nghiêm túc nó có lẽ là "phạm vi đơn vị biên dịch". – Clifford

Các vấn đề liên quan