Dzisiaj mam problem. Potrzebuję staticfunkcji członka, constnie jest to konieczne, ale lepsze. Ale nie udało mi się. Czy ktoś może powiedzieć, dlaczego lub jak?
Dzisiaj mam problem. Potrzebuję staticfunkcji członka, constnie jest to konieczne, ale lepsze. Ale nie udało mi się. Czy ktoś może powiedzieć, dlaczego lub jak?
Odpowiedzi:
Kiedy stosować constkwalifikator do nonstatic funkcji składowej, to wpływa na thiswskaźnik. Dla wykwalifikowanych const funkcji członka klasy C, thiswskaźnik jest typu C const*, podczas gdy dla funkcji członka, który nie jest const wykwalifikowanych The thiswskaźnik jest typu C*.
Statyczna funkcja składowa nie ma thiswskaźnika (taka funkcja nie jest wywoływana w konkretnym wystąpieniu klasy), więc kwalifikacja const statycznej funkcji składowej nie ma żadnego sensu.
constmusiałoby być takie samo dla elementu statycznego, jak dla elementu niestatycznego. Jako przykład, którego to myślenie nie ma, rozważ znaczenie static, które zależy od kontekstu.
C const*czy const C*?
Zgadzam się z twoim pytaniem, ale niestety C ++ jest tak zaprojektowane. Na przykład:
class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
Na dzień dzisiejszy rozpatrywany constjest w kontekście this. W pewnym sensie jest wąski. Można go poszerzyć, stosując to constpoza thiswskaźnikiem.
tzn. „proponowany” const, który może mieć również zastosowanie do staticfunkcji, ograniczy staticczłonkom możliwość dokonywania jakichkolwiek zmian.
W przykładowym kodzie, jeśli foo()można wykonać const, to w tej funkcji A::snie można go modyfikować. Nie widzę żadnych efektów ubocznych języka, jeśli ta reguła jest dodana do standardu. Wręcz przeciwnie, zabawne jest to, dlaczego taka zasada nie istnieje!
constdotyczy obiektu (w przypadku funkcji składowych stałych, instancji, na której jest wywoływana). Jeśli chcesz, aby dotyczyło to wszystkich statycznych członków klasy, domyślam się, że jeśli w ogóle było to rozważane przez komitet, to nie uważano, że jest to wystarczająco powszechny wymóg wsparcia.
constModyfikator nie stosuje się metod członkowskich lub zmiennych składowych, ale niejawnego this-pointer. Ponieważ statyczna metoda thisskładowa nie jest powiązana z obiektem, nie ma -pointer do wykonania const.
Nie wchodząc w szczegóły, dzieje się tak dlatego, że może istnieć obiekt zmodyfikowany przez funkcję lub nie, więc const jest niejednoznaczne dla kompilatora.
Przypomnij sobie, że constobiekty są stałe, ale może istnieć obiekt, który ma być stały, ale nie musi.
thiswskaźnika. (Poza tym constnie utrzymuje stałych obiektów. Zapobiega użyciu określonego wskaźnika lub odniesienia do modyfikacji obiektu, ale modyfikacja może nadal nastąpić za pośrednictwem innej ścieżki)
Szkoda, że C ++ nie akceptuje tego zgodnie z projektem, ale logicznie jest kilka przypadków użycia, w których sprawdza się dobrze.
Funkcja, która jest prawidłowa na poziomie klasy (statyczna), może nie zmieniać żadnych danych statycznych, być może będzie to po prostu dane zapytania, które powinny być stałe. Może tak powinno być
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
„Stała funkcja składowa” nie może modyfikować obiektu, do którego jest wywoływana, ale statyczne funkcje składowe nie są wywoływane w żadnym obiekcie. Jest używany bezpośrednio przez operatora rozpoznawania zakresu. Zatem posiadanie stałej statycznej funkcji składowej nie ma sensu, dlatego jest nielegalne.
constoznaczałaby dla Ciebie statyczna funkcja członkowska?