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