web-dev-qa-db-fra.com

Comment utiliser const_cast?

J'ai une variable privée dans ma classe Student définie comme suit:

const int studentNumnber;

J'essaie d'écrire un constructeur de copie pour l'étudiant et je dois rejeter la constance pour le faire, malheureusement je ne comprends pas comment utiliser std::const_cast.

Voici ce que j'essaie de faire dans mon constructeur de copie:

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

Cela ne fonctionne pas ... Je ne sais pas quelle est la syntaxe pour le faire.

27
Sarah

Vous n'êtes pas autorisé à const_cast variables qui sont en fait const. Il en résulte un comportement indéfini. const_cast est utilisé pour supprimer la constance des références et des pointeurs qui se réfèrent finalement à quelque chose qui n'est pas const.

Donc, cela est autorisé:

int i = 0;
const int& ref = i;
const int* ptr = &i;

const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;

Elle est autorisée car i, l'objet auquel est affecté, n'est pas const. Ce qui suit n'est pas autorisé:

const int i = 0;
const int& ref = i;
const int* ptr = &i;

const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;

car ici i est const et vous le modifiez en lui affectant une nouvelle valeur. Le code sera compilé, mais son comportement n'est pas défini (ce qui peut signifier n'importe quoi de "ça marche très bien" à "le programme va planter".)

Vous devez initialiser les membres de données constants dans les initialiseurs du constructeur au lieu de les affecter dans le corps des constructeurs:

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