Скажем, у меня есть класс, который выглядит следующим образом (это только пример):
class A {
double *ptr;
public:
A() : ptr( new double[100] ) {}
A( const A &other ) {
other.ptr[7] = 15;
}
void doNotChangeMyData() const {
ptr[43] = 14;
}
void changeMyData() {
ptr[43] = 14;
}
~A() { delete[] ptr; }
};
И const
в конструкторе копирования, и в doNotChangeMyData
функции делают его таким, чтобы ptr
его нельзя было изменить; однако, это все еще позволяет мне изменять содержимое массива, на который указывает ptr
.
Есть ли способ предотвратить изменение содержимого ptr
массива только в const
экземплярах, за исключением «осторожности» (или отказа от необработанного указателя)?
Я знаю, что могу сделать что-то вроде
void doNotChangeMyData() const {
const double *const ptr = this->ptr;
ptr[43] = 14; // then this would fail to compile
}
Но я бы не хотел ...
std::vector::operator[]()
можно изменить значения правильно?
vector
будет работать.
std::vector::operator[]() const
возвращает const
ссылку
std::vector