В функции-члене const
тип data
изменяется с int*
на int *const
:
int * const data;
, что означает, что в функции-члене const указатель равен const
, а не сами данные, на которые указывает указатель. Таким образом, вы не можете сделать следующее:
data = new int[100]; //error
, поскольку он пытается изменить сам указатель, который является константным, следовательно, запрещен, но допускается следующее:
data[0] = 100; //ok
Потому что при изменении содержимое не меняется указатель . data
указывает на то же место в памяти.
Если вы используете std::vector<int>
, тогда вы можете достичь того, что вы хотите. Фактически, вектор решает эту проблему, наряду с проблемами управления памятью, поэтому используйте ее:
class MyClass
{
public:
MyClass();
int getSomething() const;
private:
std::vector<int> data;
};
MyClass::MyClass() : data(10) {} //vector of size 10
int MyClass::getSomething() const
{
data[4] = 3; // compilation error - this is what you wanted.
return data[4];
}
Избегайте не-RAII дизайна столько, сколько сможете. RAII - превосходное решение проблем управления памятью. Здесь, с его помощью, вы добиваетесь того, чего хотите. Прочитайте это: