2010-05-21 23 views
13
// MyClass.h 

namespace MyNamespace { 

    static const double GasConstant = 1.987; 

    class MyClass 
    { 
    // constructors, methods, etc. 
    }; 
} 

trước đây tôi đã GasConstant khai báo trong tờ khai MyClass (và có một định nghĩa riêng biệt trong tập tin nguồn từ C++ không hỗ trợ const khởi của các loại phi không thể thiếu). Tuy nhiên tôi cần phải truy cập nó từ các tập tin khác và cũng về mặt logic nó có vẻ như nó nên cư trú ở cấp độ không gian tên.tác động gì const tĩnh có trên một thành viên namespace

Câu hỏi của tôi là, static const có ảnh hưởng gì trong trường hợp này? Rõ ràng const có nghĩa là tôi không thể gán giá trị mới cho GasConstant, nhưng một thành viên tĩnh tại không gian tên có nghĩa là gì. Điều này tương tự như tĩnh ở phạm vi tập tin, nơi mà các thành viên không thể truy cập bên ngoài của đơn vị?

+0

Đây có phải là tệp tiêu đề (.h) hoặc trong tệp triển khai (.cpp) ??? – AnT

+0

Nó nằm trong tệp tiêu đề (.h). –

+2

Trong C++ không có phạm vi tệp. Chỉ có phạm vi không gian tên trong C++ nếu bạn đang ở bên ngoài các hàm và các lớp. Ngoài ra, nếu bạn đọc trên một số trang mà họ gọi là "toàn cầu", chúng thường có nghĩa là không gian tên chung và các không gian tên khác được bao gồm. 'cplusplus.com' được biết đến với việc sử dụng không chính xác từ" toàn cầu ", ví dụ. Vì vậy, nếu một cái gì đó giải thích hiệu ứng của "tĩnh" trong "phạm vi toàn cầu", chúng thường có nghĩa là hiệu ứng của nó trong phạm vi không gian tên. –

Trả lời

7

Việc sử dụng static ở phạm vi không gian tên đã không được dùng nữa trong C++. Nó thường sẽ chỉ được thấy trong một tệp nguồn, nơi mà hiệu ứng của nó là biến biến cục bộ thành tệp nguồn đó. Tức là, một tệp nguồn khác có thể có một biến chính xác cùng tên mà không có xung đột.

Trong C++, cách được khuyến nghị để tạo biến cục bộ cho tệp nguồn là sử dụng không gian tên ẩn danh.

Tôi nghĩ công bằng khi nói rằng static trong tiêu đề trong mã của bạn chỉ đơn giản là không chính xác.

* Như được Tom chỉ ra trong phần bình luận (và trong số này là answer), ủy ban C++ đã đảo ngược quyết định không dùng static sử dụng ở phạm vi tệp, trên cơ sở sử dụng này sẽ luôn là một phần của ngôn ngữ. C khả năng tương thích).

+1

Cách được đề xuất để thực hiện việc này .... chính xác bạn có ý gì bởi "điều này"? Tôi không chắc chắn nó rõ ràng với tôi. –

+1

Quyết định ngưng sử dụng ở cấp không gian tên không còn nữa: http://stackoverflow.com/questions/4726570/deprecation-of-the-static-keyword-no-more, điều này làm cho câu trả lời này không chính xác, như bây giờ sử dụng các không gian tên ẩn danh hoặc tĩnh là hai cách được chấp nhận và chính xác để đạt được điều tương tự. – Tom

+0

Cảm ơn bạn đã cập nhật, @Tom - Tôi sẽ cập nhật câu trả lời. –

4

MSDN nói:

Khi sửa đổi một biến, từ khóa tĩnh xác định rằng biến có thời gian tĩnh (nó được phân bổ khi chương trình bắt đầu và deallocated khi chương trình kết thúc) và khởi nó đến 0 trừ khi giá trị khác được chỉ định. Khi sửa đổi biến số hoặc chức năng ở phạm vi tệp, từ khóa tĩnh chỉ định rằng biến số hoặc hàm có liên kết nội bộ (tên của nó không hiển thị từ bên ngoài tệp mà nó được tuyên bố là ).

Hãy nhớ rằng bao gồm tệp tiêu đề có nghĩa là thay thế "#include" -directive bằng mã thực tế của tệp tiêu đề. Vì vậy, các biến tĩnh sẽ chỉ hiển thị trong tệp ".cpp" (được biên dịch) bao gồm hai tệp tiêu đề.

Vì vậy, mỗi "cpp" -file bao gồm các tiêu đề sẽ có biến tĩnh riêng của nó.

+0

Bây giờ tôi đã khai báo/định nghĩa GasConstant trong một Constants.h được bao gồm trong MyClass.h. Âm thanh như nó sẽ chỉ được hiển thị trong các tập tin bao gồm Constants.h hoặc MyClass.h, và không phải từ bất kỳ tập tin nào khác mà không. Điều gì sẽ xảy ra nếu một tệp khác bao gồm cả hai? –

+3

Mỗi tệp .cpp sẽ nhận được bản sao độc lập của riêng nó. Có thể rất tốt không phải là những gì bạn muốn ... hoặc có thể nó được. Đối với các tập tin .cpp bao gồm cả hai, điều này không nên thay đổi bất cứ điều gì, nhưng tất nhiên bạn sẽ cần sự bảo vệ tiêu đề thích hợp. –

+0

Vì vậy, âm thanh như những gì tôi muốn làm chỉ đơn giản là làm cho nó const. –

1

Nếu đây là tệp tiêu đề, thì static không có hiệu lực trong trường hợp này. const đối tượng đã có liên kết nội bộ theo mặc định trong C++, vì vậy cho dù bạn khai báo nó với static hoặc không có static không có sự khác biệt nào.

Tôi cho rằng bạn chỉ cần di chuyển khai báo từ lớp vào không gian tên. Nhưng static có ý nghĩa hoàn toàn khác nhau trong ngữ cảnh của khai báo lớp và trong ngữ cảnh của không gian tên. Bên trong lớp học, bạn cần static. Trong không gian tên, static là thừa.

+0

nhưng không phải là trường hợp các tệp riêng biệt bao gồm tiêu đề sẽ có các phiên bản riêng biệt của thành viên không gian tên do hoạt động tĩnh tương tự với phạm vi tệp tĩnh không? Điều này sẽ không quan trọng tất nhiên kể từ khi const của nó, tức là điều này sẽ là một vấn đề nếu tôi nghĩ rằng hai tập tin có quyền truy cập vào cùng một thành viên và cập nhật từ một sẽ được phản ánh trong khác. Chỉ cố gắng giữ nó thẳng. –

+1

Trong thực tế, anh ta không cần 'tĩnh' trong lớp. Với nó và không có nó, cả hai đều không hợp lệ cho 'double' :) –

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