Поведение о const_cast & lt; & gt;

Я написал небольшую проблему для проверки поведения const_cast на элементе данных const.

using namespace std;class myString{
public:
myString(char * str)
{
p=str;
}
const char * getString(){
return p;
}
private:
const char *p;
} ;int main()
{
char *p=(char*)malloc(8);
cin>>p;
myString *m= new myString(p);
char *s =const_cast<char*>(m->getString());
s[6]='y';
cout<<s<<endl;
return 0;
}

После запуска этой программы я выдаю ее как «yogendra» (строка из 8 букв). и я получил вывод как «yogendya» Теперь мои сомнения. Через const_cast<> мы можем переопределить поведение самого элемента данных, так как здесь строка является const char *, но после приведения я могу ее изменить.

0

Решение

Вы точно описали, что const_cast для — это позволяет вам удалить constNess от чего-то и изменить это. Вам решать не злоупотреблять этой властью. 🙂

(В вашем случае это не относится, но учтите, что вы можете вызвать сбои, используя const_cast — например:

const char *c = "Hello";
char *s = const_cast<char*>(c);
s[0] = 'h';

может произойти сбой, потому что компилятор может поместить строковый литерал в постоянную память.)

5

Другие решения

да, вы можете использовать const_cast<> таким образом, и это не будет неопределенным поведением, так как объект, на который указывает const char* в вашем классе действительно неконстантного типа char*, но будь осторожен:.
Стандарт С ++. §7.1. 5.1 / 4 говорит

За исключением того, что любой член класса, объявленный mutable (7.1.1), может быть изменен,
любая попытка изменить объект const во время его жизни (3.8) приводит к
в неопределенном поведении

безопасное использование const_cast — это приведение const из константной ссылки к неконстантному объекту: когда есть неконстантный объект, и у вас есть const ref для него, вы можете безопасно привести констант из этого

1

Если вы говорите

char *s =const_cast<char*>(m->getString());

затем вы по существу удаляете «const» из указателя, и вы объявляете s быть указателем на символ, и это записываемая строка. Итак, следующая строка

s[6]='y';

отлично в порядке. Чтобы сохранить const вы должны объявить s в качестве константного указателя

const char *s = m->getString();

в этом случае вы не сможете перезаписать постоянную строку (ошибка: присвоение места только для чтения). Я полагаю, это то, что вы хотите? const_cast просто добавит / удалит const и в вашем случае удалите его.

0
По вопросам рекламы [email protected]