c++ const-cast

c++ - ¿Cómo usar const_cast?



const-cast (2)

Tengo una variable privada en mi clase de Student definida como:

const int studentNumnber;

Estoy tratando de escribir un constructor de copia para el Estudiante y necesito desechar la constancia para hacer esto, desafortunadamente no entiendo cómo usar std::const_cast .

Esto es lo que estoy tratando de hacer en mi constructor de copia:

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

Esto no funciona ... No estoy seguro de cuál es la sintaxis para hacer esto.


En tu código estás intentando lanzar este puntero en lugar de variable. Puedes probar lo siguiente:

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


No se le permite a const_cast variables que en realidad son const . Esto resulta en un comportamiento indefinido. const_cast se usa para eliminar la const_cast de las referencias y los punteros que en última instancia se refieren a algo que no es const .

Por lo tanto, esto está permitido:

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

Está permitido porque i , el objeto que se asigna, no es const . Lo de abajo no está permitido:

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

porque aquí i es const y usted lo está modificando asignándole un nuevo valor. El código se compilará, pero su comportamiento es indefinido (lo que puede significar cualquier cosa desde "funciona bien" a "el programa se bloqueará").

Debe inicializar los miembros de datos constantes en los inicializadores del constructor en lugar de asignarlos en el cuerpo de constructores:

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