Mam podstawowe pytanie dotyczące wskaźników const. Nie wolno mi wywoływać funkcji niebędących składowymi stałymi przy użyciu wskaźnika do stałej. Jednak mogę to zrobić na wskaźniku const:
delete p;
Spowoduje to wywołanie destruktora klasy, która w istocie jest „metodą” inną niż stała. Dlaczego jest to dozwolone? Czy to tylko w celu wsparcia tego:
delete this;
Czy jest jakiś inny powód?
c++
constants
delete-operator
Naveen
źródło
źródło
const Foo * f
lubFoo const * f
nie jest wskaźnikiem stałej do Foo. To jest poiner do const Foo.Foo * const f
jest wskaźnikiem do stałej Foo.Ujmując to w ten sposób - gdyby nie było to dozwolone, nie byłoby możliwości usunięcia obiektów const bez użycia const_cast.
Semantycznie const jest wskazaniem, że obiekt powinien być niezmienny. Nie oznacza to jednak, że obiekt nie powinien zostać usunięty.
źródło
Tak, jesteś.
class Foo { public: void aNonConstMemberFunction(); }; Foo* const aConstPointer = new Foo; aConstPointer->aNonConstMemberFunction(); // legal const Foo* aPointerToConst = new Foo; aPointerToConst->aNonConstMemberFunction(); // illegal
Pomyliłeś wskaźnik do stałej obiektu, który nie jest stałym obiektem, ze wskaźnikiem niebędącym stałym obiektem.
Powiedziawszy to,
delete aConstPointer; // legal delete aPointerToConst; // legal
usunięcie również jest legalne z powodów podanych już w innych odpowiedziach tutaj.
źródło
Konstruktorów i Destruktorów nie należy postrzegać jako „metod”. Są to specjalne konstrukcje służące do inicjalizacji i niszczenia obiektu klasy.
„const pointer” ma wskazywać, że stan obiektu nie ulegnie zmianie, gdy wykonywane są na nim operacje, gdy jest on żywy.
źródło
Inny sposób spojrzenia na to: dokładne znaczenie wskaźnika const jest takie, że nie będziesz w stanie dokonać zmian w wskazanym obiekcie, który byłby widoczny przez ten lub inny wskaźnik lub odniesienie do tego samego obiektu. Ale kiedy obiekt ulega zniszczeniu, wszystkie inne wskaźniki na adres poprzednio zajmowany przez teraz usunięty obiekt nie są już wskaźnikami do tego obiektu . Przechowują ten sam adres, ale ten adres nie jest już adresem żadnego obiektu (w rzeczywistości może wkrótce zostać ponownie użyty jako adres innego obiektu).
To rozróżnienie byłoby bardziej oczywiste, gdyby wskaźniki w C ++ zachowywały się jak słabe referencje, tj. Gdy tylko obiekt zostanie zniszczony, wszystkie istniejące wskaźniki do niego zostaną natychmiast ustawione na
0
. (Tego rodzaju rzeczy uważane są za zbyt kosztowne w czasie wykonywania, aby narzucać je wszystkim programom C ++ i w rzeczywistości nie można uczynić ich całkowicie niezawodnymi.)AKTUALIZACJA : Czytając to dziewięć lat później, jest to prawnicze. Teraz uważam, że twoja pierwotna reakcja jest zrozumiała. Niedopuszczenie do mutacji, ale pozwolenie na zniszczenie, jest oczywiście problematyczne. Implikowana umowa wskaźników / odwołań do stałych jest taka, że ich istnienie będzie działać jak blokada zniszczenia obiektu docelowego, czyli automatyczne usuwanie elementów bezużytecznych.
Zwykłym rozwiązaniem tego problemu jest użycie prawie każdego innego języka.
źródło
std::unique_ptr<const T>
zakończeniem, to jest życie?