web-dev-qa-db-ja.com

const_castの使用方法

私のStudentクラスにプライベート変数が定義されています:

const int studentNumnber;

学生用のコピーコンストラクタを作成しようとしていますが、これを行うにはconstを捨てる必要がありますが、残念ながら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);
    }

これは機能しません...これを行うための構文が何なのかわかりません。

27
Sarah

const_cast実際にはconstである変数。これにより、未定義の動作が発生します。 const_castは、constではないものを最終的に参照する参照およびポインターからconst-nessを削除するために使用されます。

したがって、これは許可されています:

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

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

割り当てられるオブジェクトであるiconstではないため許可されています。以下は許可されていません。

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

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

ここでiconstであり、新しい値を割り当てて変更しているためです。コードはコンパイルされますが、その動作は未定義です(「正常に動作する」から「プログラムがクラッシュする」までのすべてを意味します)。

定数のデータメンバをコンストラクタの本体で割り当てるのではなく、コンストラクタの初期化子で初期化する必要があります。

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