Hôm nay tôi có một vấn đề. Tôi đang cần một static
chức năng thành viên, const
khô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 static
chức năng thành viên, const
khô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 const
cho một hàm thành viên không tĩnh, nó sẽ ảnh hưởng đến this
con trỏ. Đối với một hàm thành viên đủ điều kiện const của lớp C
, this
con 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, this
con trỏ là kiểu C*
.
Một hàm thành viên tĩnh không có this
con 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ì.
const
sẽ 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 static
nó, 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 const
bên ngoài this
con trỏ.
tức là "đề xuất" const
, cũng có thể áp dụng cho các static
chức năng, sẽ hạn chế các static
thà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::s
khô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ợ.
const
sử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 const
giữ 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.
this
con trỏ. (Bên cạnh đó, const
khô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.
const
hàm thành viên tĩnh có nghĩa là gì?