как использовать const cast?
у меня есть частная переменная в моем Student
класс определен как:
const int studentNumnber;
Я пытаюсь написать конструктор копирования для студента, и мне нужно отбросить константу, чтобы сделать это, к сожалению, я не понимаю, как использовать std::const_cast
.
это то, что я пытаюсь сделать в моем конструкторе копирования:
Student(const Student & s)
: Person(p.getName(), p.getEmailAddress(), p.getBirthDate()), school(0), studentNumber(0){
school = new char[strlen(s.school) +1];
strcpy_s(school, strlen(s.school) +1, s.school);
const_cast<int*>(this)->studentNumber = s.studentNumber;
//studentNumber= s.studentNumber);
}
это не сработает... Я не уверен, что синтаксис должен это сделать
2 ответов
не допускается const_cast
переменные, которые на самом деле const
. Это приводит к неопределенному поведению. const_cast
используется для удаления const-ness из ссылок и указателей, которые в конечном итоге относятся к чему-то, что не const
.
Итак, это разрешено:
int i = 0;
const int& ref = i;
const int* ptr = &i;
const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;
это разрешено, потому что i
объект будет назначена, не const
. Ниже не допускается:
const int i = 0;
const int& ref = i;
const int* ptr = &i;
const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;
так вот i
is const
и вы изменение путем присвоения ему нового значения. Код будет компилироваться, но его поведение не определено (что может означать что угодно: от "он работает просто отлично" до "программа рухнет".)
вы должны инициализировать постоянные члены данных в инициализаторах конструктора вместо их назначения в теле конструкторов:
Student(const Student & s)
: Person(p.getName(), p.getEmailAddress(), p.getBirthDate()),
school(0),
studentNumber(s.studentNumber)
{
// ...
}
в вашем коде вы пытаетесь привести этот указатель вместо переменной. Вы можете попробовать следующее:
Student(const Student & s)
: Person(p.getName(), p.getEmailAddress(), p.getBirthDate()), school(0), studentNumber(0) {
school = new char[strlen(s.school) + 1];
strcpy_s(school, strlen(s.school) + 1, s.school);
*const_cast<int*>(&studentNumber) = s.studentNumber;
}