【发布时间】:2011-09-19 02:26:16
【问题描述】:
我正在学习 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...
这样好吗?我的意思是修改私有数据,因为 return const char* 的目的是防止更改私有数据。我该如何防止这种情况? (不使用 std::string)
【问题讨论】:
-
强制转换在 C++ 中有如此可怕的语法的原因是阻止人们使用它们(说真的!)。
const仅在人们不故意规避它的情况下才有效,但这并不是故意的。目的是避免意外修改,它做得很好。如果有人愿意,您无法阻止他们恶意破坏您的代码。他们也可以写#define private public,你无能为力。 -
您可以发明更简单的
const_cast被错误使用的例子。例如,const char *str = "foo"; const_cast<char *>(str)[0] = 'b';。 -
作为一个侧面(以及更多“C++”)的解决方案,不要暴露指向私有数据成员的指针,而是存储一个私有的
std::string,如果你真的不想让任何人修改它通过副本公开它(因为 const-references 也可以被 const-cast 掉)。 -
@Oli
str是char*类型,我认为不需要const_cast。另外,您不是在尝试修改其行为未定义的常量字符串文字吗? -
@user803563:
str是char const[4]类型,衰减为char const*。不推荐使用char*指向静态分配的字符串,尝试修改它是未定义的行为(有或没有const)。
标签: c++ const-cast