常量使用 - 这里应该更改什么来解决问题?

时间:2015-08-28 04:59:03

标签: c++ const

我正在阅读有效的C ++书籍,它正在谈论const正确性。提供了以下代码块:

class CTextBlock {
public:
    ...
    char& operator[](std::size_t position) const // inappropriate (but bitwise
    { return pText[position]; }                  // const) declaration of
                                                 // operator[]
private:
    char *pText;
};

这本书描述了上述用法的潜在问题。

const CTextBlock cctb("Hello"); // declare constant object
char *pc = &cctb[0];            // call the const operator[] to get a
                                // pointer to cctb’s data
*pc = ’J’;                      // cctb now has the value “Jello”

应该更改哪些内容以禁止在最后一行中使用的分配?这本书没有给出解决问题的方法。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

这是代码的不同部分如何工作的结果。 Const应该提供有关对象使用的指导并防止编程错误。通过使用它,您告诉其他程序员不应该更改此值。实际上没有办法确保数据不会更改。这是因为在c ++中有许多方法可以访问底层内存并进行更改。在您给出的示例中,通过使用指针。

为什么这可能会问你。可以在以下位置找到一个很好的答案:http://www.cprogramming.com/tutorial/const_correctness.html 相关部分内容如下:

  

首先,为什么你想要能够在声明为const的类中更改数据?这是constness意味着什么的核心,有两种思考方式。一个想法是“按位常量”,这基本上意味着const类应始终在内存中具有完全相同的表示。不幸的是(或幸运的是),这不是C ++标准使用的范例;相反,C ++使用“概念常量”。概念constness指的是const类的输出应始终相同的想法。这意味着只要基本行为保持不变,基础数据可能会发生变化。 (实质上,“概念”是不变的,但表示可能会有所不同。)

还有其他方法可以确保特定值保持不变,这些值很难更改,或者在运行时无法更改,这是您的目标。您还可以查看使用#define或enum,具体取决于您要实现的目标。我建议在使用其中任何一个之前研究差异,因为虽然它们都执行类似的功能,但边缘情况可能会产生非常不同的结果,并且每个都有不同的限制。值得注意的是,一些开发人员对于应该使用哪些选项以及何时使用有非常强烈的意见。例如,由于以下原因,您应该支持enum over #define,原因如下:http://blogs.msdn.com/b/doronh/archive/2006/03/27/562502.aspx

可以在此处找到enum和const之间差异的详细说明:http://www.codeproject.com/Articles/4354/Enum-vs-Const

值得注意的是,const与c ++在c ++中的工作方式是不同的,因此请确保在阅读有关如何使用const以及何时使用正确语言阅读其应用程序的时候。

答案 1 :(得分:1)

访问者应返回const char &以限制对返回值的写访问权。

答案 2 :(得分:1)

const char& operator[](std::size_t position) const
除非代码用户使用const_cast删除const,否则

会阻止这种情况。

添加const表示无法更改引用所引用的数据