Можно ли переопределить мою функцию-член const C ++, возвращающую константный указатель на внутренний неконстантный массив, используя const_cast? - PullRequest
5 голосов
/ 21 июня 2011

Я изучаю c ++ и наткнулся на этот оператор const_cast.Рассмотрим следующий пример:

class Test
{  
  private:
    char name[100];
  public:
    Test(const char* n) { std::strncpy(name, n, 99); name[99]=0; }
    const char* getName() const { return name; }
}

Теперь пользователь может сделать

Test t("hi");
const_cast<char*>(t.getName())[0] = 'z'; //modifies private data...

Это нормально?Я имею в виду изменение личных данных, поскольку целью возврата const char * было предотвращение изменения личных данных.Как мне предотвратить это?(без использования std :: string)

Ответы [ 2 ]

6 голосов
/ 21 июня 2011

Нет, это не «хорошо». Хотя это возможно. Но C ++ не навязывает хорошее поведение программистам. В основном это позволяет вам декларировать вещи таким образом, чтобы показать их предполагаемое использование. Если программист решает обойти эту защиту, он должен знать, что он делает.

Бьярн Страуструп : Да. Это новый синтаксис приведения. Слепки действительно предоставляют необходимую услугу. Новый синтаксис является улучшением по сравнению с приведением в стиле C, потому что он позволяет компилятору проверять ошибки, которые он не мог сделать со старым синтаксисом. Но новый синтаксис был сделан намеренно уродливым, потому что приведение все еще является уродливой и часто небезопасной операцией.

4 голосов
/ 21 июня 2011

Нет, это не хорошо, но в этом весь смысл const_cast. Обычно, когда программист переопределяет const, может случиться целая куча плохих вещей, и это не рекомендуется делать. Я не уверен, что вы можете помешать кому-либо сделать это, потому что смысл const_cast состоит в том, чтобы отвергнуть защиту, обычно предоставляемую const.

...