Const用法——这里应该修改什么来修复这个问题
Const usage - What should be changed here to fix the issue?
我正在看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
访问器应该返回一个const char &
来限制对返回值的写访问
const char& operator[](std::size_t position) const
将防止这种情况,除非代码的用户使用const_cast
来删除const
。
添加const
意味着不能更改引用引用的数据
- 警告处理为错误这里有什么问题
- 修改C++结构的特征成员时出现问题
- packaged_task示例问题?斯特劳斯特鲁普示例修改
- 我在让我的代码输出整个链表时遇到问题.它只是输出我修改过的一些文本文件,而不是整个东西
- Boost::P rocess编译问题,不得不修改库才能使其工作
- 作用域问题:如何从类外查看(不访问也不修改!)私有属性
- 修改后的变更问题
- 使用基对象修改/访问派生类的信息的有问题的设计
- C++ 修改带有数字的字符串时出现问题
- 修改鼠标移动时出现问题
- 堆栈溢出错误 c++.我如何修改/修复此代码以摆脱此问题
- C++通过引用修改函数中的结构值(可能存在编译顺序问题)
- 修改的动态背包-有问题的输入
- 在const函数中修改私有int存在问题
- 递归中修改调用指针的问题
- 在ce5上从c#传递结构体并在非托管c++ dll中修改的问题
- Const用法——这里应该修改什么来修复这个问题
- Qt,在构造函数之外修改小部件属性的问题
- 反转计数出现问题(修改合并排序的实现)
- 修改硬币更换问题以跟踪使用了多少硬币(不是最小数量)