如何使用const_cast?

Sar*_*rah 28 c++ const-cast

我的类中有一个私有变量Student定义为:

const int studentNumnber;
Run Code Online (Sandbox Code Playgroud)

我正在尝试为学生编写一个复制构造函数,我需要抛弃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);
    }
Run Code Online (Sandbox Code Playgroud)

这不起作用......我不确定这样做的语法是什么.

tim*_*rau 82

您不允许使用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;
Run Code Online (Sandbox Code Playgroud)

这是允许的,因为i被分配的对象不是const.以下是不允许的:

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

const_cast<int&>(ref) = 3;
*const_cast<int*>(ptr) = 3;
Run Code Online (Sandbox Code Playgroud)

因为这里iconst你通过为它赋予一个新值来修改它.代码将编译,但其行为是未定义的(这可能意味着从"它工作正常"到"程序将崩溃".)

您应该在构造函数的初始值设定项中初始化常量数据成员,而不是在构造函数体中分配它们:

Student(const Student & s) 
    : Person(p.getName(), p.getEmailAddress(), p.getBirthDate()),
      school(0),
      studentNumber(s.studentNumber)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • _"你不允许const_cast变量实际上是const"_这不是真的.写入这样的变量有不确定的行为,但演员本身是100%合法的(但一个坏主意,因为它创造了到达所述UB的可能性!) (14认同)
  • 如果语言有一个“const_cast”会导致未定义的行为,那么它有什么意义呢?没有意义。 (3认同)
  • “您应该初始化数据成员...”而不仅仅是const数据 (2认同)
  • 请参阅/sf/answers/3815301171/,以确认此答案是错误的。 (2认同)