как использовать 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);
}

Это не работает … Я не уверен, что синтаксис, чтобы сделать это

19

Решение

Вам не разрешено const_cast переменные, которые на самом деле const, Это приводит к неопределенному поведению. const_cast используется для удаления константности из ссылок и указателей, которые в конечном итоге ссылаются на то, что не является 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 является const и вы модифицируете его, присваивая ему новое значение. Код скомпилируется, но его поведение не определено (что может означать что угодно, от «он работает просто отлично» до «программа потерпит крах».)

Вы должны инициализировать константные элементы данных в инициализаторах конструктора вместо назначения их в теле конструкторов:

Student(const Student & s)
: Person(p.getName(), p.getEmailAddress(), p.getBirthDate()),
school(0),
studentNumber(s.studentNumber)
{
// ...
}
63

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

В вашем коде вы пытаетесь привести этот указатель вместо переменной. Вы можете попробовать следующее:

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;
}
-4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector