У меня основной вопрос относительно константных указателей. Мне не разрешено вызывать какие-либо неконстантные функции-члены с использованием константного указателя. Однако мне разрешено делать это с указателем const:
delete p;
Это вызовет деструктор класса, который по сути является неконстантным «методом». Почему это разрешено? Просто чтобы поддержать это:
delete this;
Или есть какая-то другая причина?
c++
constants
delete-operator
Naveen
источник
источник
const Foo * f
илиFoo const * f
не является константным указателем на Foo. Это указатель на const Foo.Foo * const f
константный указатель на Foo.Скажем так - если бы это было запрещено, не было бы возможности удалить объекты const без использования const_cast.
Семантически const указывает на то, что объект должен быть неизменным. Однако это не означает, что объект нельзя удалять.
источник
Да Вы.
class Foo { public: void aNonConstMemberFunction(); }; Foo* const aConstPointer = new Foo; aConstPointer->aNonConstMemberFunction(); // legal const Foo* aPointerToConst = new Foo; aPointerToConst->aNonConstMemberFunction(); // illegal
Вы перепутали константный указатель на неконстантный объект с неконстантным указателем на константный объект.
Было сказано, что,
delete aConstPointer; // legal delete aPointerToConst; // legal
также законно удалить по причинам, уже указанным в других ответах здесь.
источник
Конструкторы и деструкторы не следует рассматривать как «методы». Это специальные конструкции для инициализации и удаления объекта класса.
«Константный указатель» означает, что состояние объекта не будет изменяться, когда над ним выполняются операции, пока он жив.
источник
Другой способ взглянуть на это: точное значение константного указателя заключается в том, что вы не сможете вносить изменения в указанный объект, который был бы виден через этот или любой другой указатель или ссылку на тот же объект. Но когда объект разрушается, все другие указатели на адрес, ранее занятый теперь удаленным объектом , больше не являются указателями на этот объект . В них хранится один и тот же адрес, но этот адрес больше не является адресом какого-либо объекта (на самом деле, вскоре он может быть повторно использован как адрес другого объекта).
Это различие было бы более очевидным, если бы указатели в C ++ вели себя как слабые ссылки, т. Е. Как только объект был уничтожен, все существующие указатели на него немедленно были бы установлены на
0
. (Такие вещи считаются слишком дорогостоящими во время выполнения, чтобы навязывать их всем программам на C ++, и на самом деле невозможно сделать их полностью надежными.)ОБНОВЛЕНИЕ : Если читаю это девять лет спустя, это похоже на юриста. Теперь я нахожу вашу первоначальную реакцию понятной. Очевидно, что запретить мутации, но разрешить разрушение. Подразумеваемый контракт константных указателей / ссылок заключается в том, что их существование будет действовать как блокировка при уничтожении целевого объекта, иначе говоря, автоматическая сборка мусора.
Обычное решение - использовать вместо этого практически любой другой язык.
источник
std::unique_ptr<const T>
концом его жизни?