可以覆盖我的const C ++成员函数,使用const_cast返回一个指向内部非const数组的const指针吗?

时间:2011-06-20 23:07:53

标签: c++ const-cast

我正在学习c ++并遇到了这个const_cast运算符。请考虑以下示例:

class Test
{  
  private:
    char name[100];
  public:
    Test(const char* n) { std::strncpy(name, n, 99); name[99]=0; }
    const char* getName() const { return name; }
}

现在用户可以

Test t("hi");
const_cast<char*>(t.getName())[0] = 'z'; //modifies private data...

这样好吗?我的意思是修改私有数据,因为返回const char *的目的是防止更改私有数据。我该如何防止这种情况? (不使用std :: string)

2 个答案:

答案 0 :(得分:6)

不,这不是'好'。虽然有可能。但是C ++并没有强迫程序员采取良好的行为。它主要允许您以显示其预期用途的方式声明事物。如果程序员决定绕过这种保护,他应该知道他在做什么。

Bjarne Stroustrup :是的。这是新的演员语法。演员确实提供必要的服务。新语法是对C样式转换的改进,因为它允许编译器检查旧语法无法解决的错误。但新的语法是刻意丑陋的,因为施法仍然是一个丑陋且往往不安全的操作。

答案 1 :(得分:4)

不,这不好,但那是const_cast的重点。通常,当程序员重写const时,可能会发生一大堆坏事,并且不建议这样做。我不确定你是否可以阻止某人这样做,因为const_cast的重点是覆盖const通常提供的保护。