Постоянная функция-член - это функция-член, которая не изменяет свои переменные-члены.
const для функции-члена не означает const char *. Что означало бы, что вы не можете изменить данные в адресе, который содержит указатель.
Ваш пример не изменяет сами переменные-члены.
Константа в функции-члене гарантирует, что вы рассматриваете все переменные-члены как const.
Это означает, что если у вас есть:
int x;
char c;
char *p;
Тогда у вас будет:
const int x;
const char c;
char * const p; //<-- means you cannot change what p points to, but you can change the data p points to
Существует 2 типа указателей констант. Функция-член const использует ту, которую я перечислил выше.
Способ получить нужную ошибку:
Попробуйте изменить:
char * rep;
до:
char rep[1024];
И удалить эту строку:
rep = new char [strlen(s)+1];
Он выдаст ожидаемую ошибку (не может изменить членов из-за ключевого слова const)
Поскольку существует только 1 тип константного массива. А это значит, что вы не можете изменять какие-либо из его данных.
Теперь вся система фактически сломана в следующем примере:
class String
{
private:
char rep2[1024];
char* rep;
...
String :: String (const char* s)
{
rep = rep2;
strcpy (rep, s);
}
Таким образом, урок, который следует извлечь из этого, заключается в том, что ключевое слово const для функций-членов не гарантирует, что ваш объект не изменится вообще.
Это только гарантирует, что каждая переменная-член будет рассматриваться как const. А для указателей существует большая разница между const char * и char * const.
В большинстве случаев постоянная функция-член будет означать, что функция-член не будет изменять сам объект, но это не всегда так, как показано в приведенном выше примере.