thế nào A
và s::A
khác nhau?
Sự khác biệt lớn nhất là việc khai báo A
cũng là định nghĩa, trong khi đó s::A
thì không. Tôi không chắc chắn ý của bạn là "quy tắc đặc biệt", nhưng static
có ý nghĩa khác trong mỗi trường hợp.
Ở phạm vi không gian tên, nó cung cấp cho nó liên kết nội bộ để đối tượng không hiển thị bên ngoài đơn vị dịch hiện tại. Lưu ý rằng static
là dư thừa ở đây, vì các biến không đổi ở phạm vi không gian tên có liên kết nội bộ theo mặc định.
Ở phạm vi lớp học, điều đó có nghĩa là có một đối tượng độc lập với bất kỳ phiên âm nào của lớp.
khi sử dụng của chúng sẽ được thay thế bằng giá trị bằng chữ?
Vì cả hai đều là hằng số không thể tách rời với bộ khởi tạo trong khai báo, cả hai có thể được sử dụng trong biểu thức không đổi và trình biên dịch có thể thay thế giá trị của chúng bằng hằng số biên dịch.
Có lẽ câu hỏi phù hợp hơn là khi nào một định nghĩa được yêu cầu?
Trong C++ 11, bắt buộc nếu biến là odr-sử dụng - gần như nói, nếu bạn làm bất cứ điều gì yêu cầu địa chỉ của biến thay vì giá trị của nó.
Trong C++ 03, tôi nghĩ rằng nó được yêu cầu nếu biến được sử dụng, mặc dù không cần chẩn đoán và nhiều trình biên dịch sẽ không phàn nàn nếu bạn chỉ sử dụng giá trị của nó. Tôi có thể sai mặc dù; các quy tắc cũ khá phức tạp và tôi rất vui khi có thể quên chúng ngay bây giờ.
khi tôi có thể lấy địa chỉ của nó?
Điều đó yêu cầu biến phải có định nghĩa, trong cả C++ 03 và C++ 11. Định nghĩa phân bổ lưu trữ cho biến, sao cho nó có địa chỉ.
khi tôi cần xác định riêng chúng?
Tuyên bố biến tại phạm vi không gian tên cũng là định nghĩa, trừ khi bạn khai báo nó extern
; do đó, biến đầu tiên của bạn không cần định nghĩa riêng.
Tuyên bố biến ở phạm vi lớp học không phải là định nghĩa; vì vậy biến thứ hai của bạn không cần định nghĩa riêng trong C++ 03 và trong C++ 11 nếu nó là odr-used.
Tại sao bạn nghĩ có sự khác biệt? Điều trị đặc biệt là chúng có thể được coi là biểu thức không đổi. Đừng nghĩ về "thay thế bằng giá trị chữ". – Pubby
@Pubby Hãy thử 'const int & x = s :: A;' sau đó, và sử dụng 'x' ở đâu đó. Rất có thể bạn sẽ gặp lỗi liên kết. – hvd