Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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