Я пытался понять, когда я пишу функцию в C++ с постоянным аргументом и переменную-указатель внутри этого объекта, чем флаг const не защищает базовую память от изменений. Например, это совершенно законно, чтобы сделать следующее в operator=()
функции класса под названием X
:Почему в C++ разрешено изменять переменную-переменную-константу объекта-объекта извне?
class X
{
public:
X& operator=(const X& other)
{
this->data = other.data; //(*)
return *this;
}
private:
int* data;
};
(*): Это то же самое, как:
int* some_pointer;
int* const other_pointer = some_pointer;
int* class_pointer = other_pointer;
Но не то же самое как:
const int* other_pointer;
int* class_pointer = other_pointer;
Какой бы генерировать следующую ошибку:
error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
int* class_pointer = other_pointer;
^
Я понимаю, почему other.x
в настоящее время отливают в int* const
, но я не понимаю, почему он не отлит в const* int
в то же время (что является const int* const
). Когда я пишу функцию с аргументом const
, моя логика предполагает, что что-либо внутри этого аргумента должно наследовать константу, поскольку это должно быть целью const
, чтобы защитить базовые данные от модификации.
Когда член указатель осуществляется доступ извне версии класса const
Я думаю, это должно быть разумно ожидать, что const
ключевого слова объекта должно защищать что-либо (даже память), которая выходит из класса от модификации. Аргумент против этого заключается в том, что внешняя память не принадлежит объекту, поэтому не следует также защищать ее. Моя перспектива заключается в том, что в этом случае (из любых других случаев, когда к нему обращаются куда-либо еще с любыми правами доступа) мы берем что-то из объекта const
. Другими словами, это дает видимость чему-то вне себя. Итак, в чем причина отсутствия видимости const
? Это не изменит права доступа к памяти в любом другом месте кода!
Я не совсем уверен, что вы просите здесь. Уточнить? – juanchopanza
Я спрашиваю, почему other.data (в функции X :: operator =()) не выполняется для const int * const, а не только для int * const и что было конструктивным решением для этого в C++. – Kristof01
Потому что это не имеет никакого смысла. – juanchopanza