[英]How to use const_cast?
我的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);
}
那不起作用......我不確定語法。
不允許const_cast
變量實際上是const
。 這會導致未定義的行為。 const_cast
用於從最終引用非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
。 以下是不允許的:
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)
{
// ...
}
在您的代碼中,您正在嘗試轉換此指針而不是變量。 您可以嘗試以下操作:
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.