簡體   English   中英

如何使用 const_cast?

[英]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;

因為這里iconst並且您正在通過為其分配一個新值來修改它。 代碼會編譯,但它的行為是未定義的(這可能意味着從“它工作得很好”到“程序會崩潰”。)

您應該在構造函數的初始值設定項中初始化常量數據成員,而不是在構造函數的主體中分配它們:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM