私の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);
}
これは機能しません...これを行うための構文が何なのかわかりません。
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;
割り当てられるオブジェクトである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)
{
// ...
}