【问题标题】:Can one override my const C++ member function returning a const pointer to a internal non-const array using const_cast?可以使用 const_cast 覆盖我的 const C++ 成员函数,返回一个指向内部非常量数组的 const 指针吗?
【发布时间】: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&lt;char *&gt;(str)[0] = 'b';
  • 作为一个侧面(以及更多“C++”)的解决方案,不要暴露指向私有数据成员的指针,而是存储一个私有的std::string,如果你真的不想让任何人修改它通过副本公开它(因为 const-references 也可以被 const-cast 掉)。
  • @Oli strchar* 类型,我认为不需要const_cast。另外,您不是在尝试修改其行为未定义的常量字符串文字吗?
  • @user803563: strchar const[4] 类型,衰减为 char const*。不推荐使用char* 指向静态分配的字符串,尝试修改它是未定义的行为(有或没有const)。

标签: c++ const-cast


【解决方案1】:

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

Bjarne Stroustrup:是的。这就是新的强制转换语法。演员表确实提供了一项基本服务。新语法是对 C 风格转换的改进,因为它允许编译器检查旧语法无法检查的错误。但是新语法被故意弄得很丑,因为强制转换仍然是一个丑陋且经常不安全的操作。

【讨论】:

  • “C++ 试图防范墨菲,而不是马基雅维利” - (或者归因于 Bjarne Stroustrup、Herb Sutter,也许还有其他人)。 @user803563:还有很多其他方法可以对私有数据做坏事。 reinterpret_cast&lt;char*&gt;(&amp;t)[0] = 'z'
【解决方案2】:

不,这不好,但这就是const_cast 的全部意义所在。通常,当程序员重写const 时,可能会发生一大堆坏事,不建议这样做。我不确定您是否可以阻止某人这样做,因为const_cast 的目的是覆盖const 通常提供的保护。

【讨论】:

  • 我还要补充一点,const 只是在编译时“帮助开发更好、更安全的代码”。生成的代码是相同的,没有什么可以阻止这些 const variables 成为常​​量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2011-03-04
相关资源
最近更新 更多