我正在学习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)
答案 0 :(得分:6)
不,这不是'好'。虽然有可能。但是C ++并没有强迫程序员采取良好的行为。它主要允许您以显示其预期用途的方式声明事物。如果程序员决定绕过这种保护,他应该知道他在做什么。
Bjarne Stroustrup :是的。这是新的演员语法。演员确实提供必要的服务。新语法是对C样式转换的改进,因为它允许编译器检查旧语法无法解决的错误。但新的语法是刻意丑陋的,因为施法仍然是一个丑陋且往往不安全的操作。
答案 1 :(得分:4)
不,这不好,但那是const_cast
的重点。通常,当程序员重写const
时,可能会发生一大堆坏事,并且不建议这样做。我不确定你是否可以阻止某人这样做,因为const_cast
的重点是覆盖const
通常提供的保护。