Dzisiaj mam problem. Potrzebuję static
funkcji członka, const
nie jest to konieczne, ale lepsze. Ale nie udało mi się. Czy ktoś może powiedzieć, dlaczego lub jak?
Dzisiaj mam problem. Potrzebuję static
funkcji członka, const
nie jest to konieczne, ale lepsze. Ale nie udało mi się. Czy ktoś może powiedzieć, dlaczego lub jak?
Odpowiedzi:
Kiedy stosować const
kwalifikator do nonstatic funkcji składowej, to wpływa na this
wskaźnik. Dla wykwalifikowanych const funkcji członka klasy C
, this
wskaźnik jest typu C const*
, podczas gdy dla funkcji członka, który nie jest const wykwalifikowanych The this
wskaźnik jest typu C*
.
Statyczna funkcja składowa nie ma this
wskaźnika (taka funkcja nie jest wywoływana w konkretnym wystąpieniu klasy), więc kwalifikacja const statycznej funkcji składowej nie ma żadnego sensu.
const
musiał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 const
jest w kontekście this
. W pewnym sensie jest wąski. Można go poszerzyć, stosując to const
poza this
wskaźnikiem.
tzn. „proponowany” const
, który może mieć również zastosowanie do static
funkcji, ograniczy static
członkom możliwość dokonywania jakichkolwiek zmian.
W przykładowym kodzie, jeśli foo()
można wykonać const
, to w tej funkcji A::s
nie 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!
const
dotyczy 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.
const
Modyfikator nie stosuje się metod członkowskich lub zmiennych składowych, ale niejawnego this
-pointer. Ponieważ statyczna metoda this
skł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 const
obiekty są stałe, ale może istnieć obiekt, który ma być stały, ale nie musi.
this
wskaźnika. (Poza tym const
nie 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.
const
oznaczałaby dla Ciebie statyczna funkcja członkowska?