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?
c++
static
language-lawyer
const-method
prabhakaran
źródło
źródło
const
oznaczałaby dla Ciebie statyczna funkcja członkowska?Odpowiedzi:
Kiedy stosować
const
kwalifikator do nonstatic funkcji składowej, to wpływa nathis
wskaźnik. Dla wykwalifikowanych const funkcji członka klasyC
,this
wskaźnik jest typuC const*
, podczas gdy dla funkcji członka, który nie jest const wykwalifikowanych Thethis
wskaźnik jest typuC*
.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.źródło
const
musiałoby być takie samo dla elementu statycznego, jak dla elementu niestatycznego. Jako przykład, którego to myślenie nie ma, rozważ znaczeniestatic
, które zależy od kontekstu.C const*
czyconst 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ściethis
. W pewnym sensie jest wąski. Można go poszerzyć, stosując toconst
pozathis
wskaźnikiem.tzn. „proponowany”
const
, który może mieć również zastosowanie dostatic
funkcji, ograniczystatic
członkom możliwość dokonywania jakichkolwiek zmian.W przykładowym kodzie, jeśli
foo()
można wykonaćconst
, to w tej funkcjiA::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!źródło
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 niejawnegothis
-pointer. Ponieważ statyczna metodathis
składowa nie jest powiązana z obiektem, nie ma -pointer do wykonaniaconst
.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.źródło
this
wskaźnika. (Poza tymconst
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
źródło
„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.
źródło