Const用法——这里应该修改什么来修复这个问题

Const usage - What should be changed here to fix the issue?

本文关键字:问题 修改 这里 用法 Const 什么      更新时间:2023-10-16

我正在看Effective 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”

应该修改什么以禁止最后一行中使用的赋值?这本书没有给出这个问题的答案。

提前感谢您的帮助!

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

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

首先,为什么要在声明为const的类中修改数据呢?这就是恒定性的核心含义,有两种思考方式。一种想法是"按位constness",这基本上意味着const类在任何时候都应该在内存中具有完全相同的表示。不幸的是(或幸运的是),这不是c++标准所使用的范式;相反,c++使用"概念上的一致性"。概念上的一致性指的是const类的输出应该总是相同的想法。这意味着,只要基本行为保持不变,底层数据就可能发生变化。(本质上,"概念"是不变的,但表示可能会变化。)

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

枚举和const之间的区别可以在这里找到一个很好的描述:http://www.codeproject.com/Articles/4354/Enum-vs-Const

值得注意的是,c和c++中const的工作方式是不同的,所以当你在阅读如何使用const以及在正确的语言中阅读它的应用时,请确保。

访问器应该返回一个const char &来限制对返回值的写访问

const char& operator[](std::size_t position) const

将防止这种情况,除非代码的用户使用const_cast来删除const

添加const意味着不能更改引用引用的数据