Я написал небольшую проблему для проверки поведения 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 *, но после приведения я могу ее изменить.
Вы точно описали, что const_cast
для — это позволяет вам удалить const
Ness от чего-то и изменить это. Вам решать не злоупотреблять этой властью. 🙂
(В вашем случае это не относится, но учтите, что вы можете вызвать сбои, используя const_cast
— например:
const char *c = "Hello";
char *s = const_cast<char*>(c);
s[0] = 'h';
может произойти сбой, потому что компилятор может поместить строковый литерал в постоянную память.)
да, вы можете использовать const_cast<>
таким образом, и это не будет неопределенным поведением, так как объект, на который указывает const char*
в вашем классе действительно неконстантного типа char*
, но будь осторожен:.
Стандарт С ++. §7.1. 5.1 / 4 говорит
За исключением того, что любой член класса, объявленный mutable (7.1.1), может быть изменен,
любая попытка изменить объект const во время его жизни (3.8) приводит к
в неопределенном поведении
безопасное использование const_cast — это приведение const из константной ссылки к неконстантному объекту: когда есть неконстантный объект, и у вас есть const ref для него, вы можете безопасно привести констант из этого
Если вы говорите
char *s =const_cast<char*>(m->getString());
затем вы по существу удаляете «const» из указателя, и вы объявляете s
быть указателем на символ, и это записываемая строка. Итак, следующая строка
s[6]='y';
отлично в порядке. Чтобы сохранить const вы должны объявить s
в качестве константного указателя
const char *s = m->getString();
в этом случае вы не сможете перезаписать постоянную строку (ошибка: присвоение места только для чтения). Я полагаю, это то, что вы хотите? const_cast
просто добавит / удалит const
и в вашем случае удалите его.