C ++ - Tại sao không thể tạo hàm thành viên tĩnh với định tính 'const'


86

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?


1
Đối với bạn, một consthàm thành viên tĩnh có nghĩa là gì?
GManNickG

2
@GMan Ý tôi là một hàm thành viên tĩnh không bao giờ thay đổi bất kỳ đầu vào nào của nó.
prabhakaran

11
Sau đó, đầu vào của bạn (tham số hàm) phải theo giá trị hoặc tham chiếu hằng số.
GManNickG

3
Dù sao nó cũng không ảnh hưởng đến tính hằng số của các đối số của các hàm thành viên. Nó không có nghĩa là "làm cho mọi thứ là const", nó có nghĩa là "làm cho const này ".
UncleBens

@GMan đang nói const phải được thêm vào các đối số
Prabhakaran

Câu trả lời:


137

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ì.


Có nghĩa là 'const' chỉ dành cho các biến như int, pointer, v.v.?
prabhakaran

@prabhakaran - Các hàm thành viên cũng có thể là const đủ điều kiện. James đã đề cập rõ ràng nó trong câu trả lời của mình.
Mahesh

Định nghĩa const của @Mahesh Member cũng chỉ đủ điều kiện cho 'con trỏ này', không phải toàn bộ. Bạn vẫn có thể thay đổi biến toàn cục trong hàm thành viên đủ điều kiện const. Bây giờ chỉ có tôi kiểm tra điều này.
prabhakaran

5
-1 "Một hàm thành viên tĩnh không có con trỏ this ... do đó, việc xác định chức năng const của một hàm thành viên tĩnh không có ý nghĩa gì [theo cách đó]" đúng bản thân nó nhưng lại sai khi là người trả lời câu hỏi "tại sao ". Như một câu trả lời, nó giả định rằng ý nghĩa của 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.
Chúc mừng và hth. - Alf

2
Là nó C const*hay const C*?
crisron

24

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!


8
Có thể giống như lý do bạn không thể sửa đổi một hàm miễn phí có nghĩa là "hàm này không sửa đổi bất kỳ biến toàn cục nào". 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ợ.
Steve Jessop,

1
Công cụ 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.
Ruud Althuizen

1

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.


2
"có thể hoặc không"? Một hàm thành viên tĩnh không bao giờ có một 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.)
Ben Voigt

1

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

1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.