Hôm nay tôi có một vấn đề. Tôi đang cần một staticchức năng thành viên, constkhông phải là phải nhưng tốt hơn. Nhưng, tôi đã không thành công trong nỗ lực của mình. Ai có thể nói tại sao hoặc làm thế nào?
Hôm nay tôi có một vấn đề. Tôi đang cần một staticchức năng thành viên, constkhông phải là phải nhưng tốt hơn. Nhưng, tôi đã không thành công trong nỗ lực của mình. Ai có thể nói tại sao hoặc làm thế nào?
Câu trả lời:
Khi bạn áp dụng định nghĩa constcho một hàm thành viên không tĩnh, nó sẽ ảnh hưởng đến thiscon trỏ. Đối với một hàm thành viên đủ điều kiện const của lớp C, thiscon trỏ là kiểu C const*, trong khi đối với một hàm thành viên không đủ điều kiện const, thiscon trỏ là kiểu C*.
Một hàm thành viên tĩnh không có thiscon trỏ (một hàm như vậy không được gọi trên một thể hiện cụ thể của một lớp), do đó, việc xác định const của một hàm thành viên tĩnh không có ý nghĩa gì.
constsẽ phải giống nhau đối với một thành viên tĩnh và đối với một thành viên không tĩnh. Như một ví dụ mà suy nghĩ đó không phù hợp, hãy xem xét ý nghĩa của staticnó, tùy thuộc vào ngữ cảnh.
C const*hay const C*?
Tôi đồng ý với câu hỏi của bạn, nhưng tiếc là C ++ được thiết kế theo cách đó. Ví dụ:
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
Tính đến ngày hôm nay, constđược xem xét trong bối cảnh của this. Theo một cách nào đó, nó hẹp. Nó có thể được mở rộng hơn bằng cách áp dụng điều này constbên ngoài thiscon trỏ.
tức là "đề xuất" const, cũng có thể áp dụng cho các staticchức năng, sẽ hạn chế các staticthành viên khỏi bất kỳ sửa đổi nào.
Trong mã ví dụ, nếu foo()có thể được thực hiện const, thì trong hàm đó, A::skhông thể sửa đổi. Tôi không thể thấy bất kỳ tác dụng phụ nào về ngôn ngữ, nếu quy tắc này được thêm vào tiêu chuẩn. Ngược lại, thật buồn cười là tại sao quy tắc như vậy không tồn tại!
constáp dụng cho một đối tượng (trong trường hợp hàm thành viên const, thể hiện mà nó được gọi). Bạn muốn áp dụng nó cho tất cả các thành viên tĩnh của lớp, tôi đoán rằng nếu nó được ủy ban xem xét, thì nó không được cho là một yêu cầu đủ phổ biến để hỗ trợ.
constsửa đổi không được áp dụng cho các phương thức thành viên hoặc các biến thành viên, nhưng đối với this-pointer ngầm định . Vì một phương thức thành viên tĩnh không bị ràng buộc với một đối tượng nên không có this-pointer để thực hiện const.
Không đi sâu vào chi tiết, đó là bởi vì có thể có hoặc không có một đối tượng nào đó được hàm sửa đổi, vì vậy const không rõ ràng đối với trình biên dịch.
Nhớ lại rằng constgiữ cho các đối tượng không đổi, nhưng có thể có hoặc không có một đối tượng ở đây để giữ không đổi.
thiscon trỏ. (Bên cạnh đó, constkhông giữ các đối tượng liên tục Nó ngăn chặn một con trỏ đặc biệt hoặc tham khảo từ được sử dụng để sửa đổi các đối tượng, nhưng sửa đổi vẫn có thể xảy ra thông qua con đường khác.)
Thật không may là C ++ không chấp nhận nó theo thiết kế nhưng về mặt logic thì có rất ít trường hợp sử dụng mà nó xác thực tốt.
Một hàm hợp lệ ở mức lớp (tĩnh) có thể không thay đổi bất kỳ dữ liệu tĩnh nào, có thể nó sẽ chỉ truy vấn dữ liệu phải là const. Có thể nó sẽ giống như
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
Một 'hàm thành viên const' không được phép sửa đổi đối tượng mà nó được gọi, nhưng các hàm thành viên tĩnh không được gọi trên bất kỳ đối tượng nào. Nó được sử dụng trực tiếp bởi toán tử phân giải phạm vi. Vì vậy, có một hàm thành viên tĩnh const không có ý nghĩa gì, do đó nó là bất hợp pháp.
consthàm thành viên tĩnh có nghĩa là gì?