45

Studentクラスに次のように定義されたプライベート変数があります。

const int studentNumnber;

のコピーコンストラクターを作成しようとしていますStudentが、これを行うには constness をキャストする必要があります。残念ながら使い方がわかりません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);
    }

それは機能しません...構文がわかりません。

4

2 に答える 2

123

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ですconst。コードはコンパイルされますが、その動作は未定義です (これは、「正常に動作する」から「プログラムがクラッシュする」まで、あらゆることを意味します)。

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

Student(const Student & s) 
    : Person(p.getName(), p.getEmailAddress(), p.getBirthDate()),
      school(0),
      studentNumber(s.studentNumber)
{
    // ...
}
于 2013-10-24T00:37:40.610 に答える
-6

あなたのコードでは、変数の代わりにこのポインターをキャストしようとしています。次のことを試すことができます。

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;
}
于 2018-03-03T01:49:11.140 に答える