如何使自己的"const data"不可修改?
How to make my own "const data" unmodifiable?
我自己的 const
属性遇到了麻烦。由于函数的存在,我无法完全保护我的const数据。函数可以修改一切
const reference
是一个可怕的东西,因为它需要一个地址;如果它是const变量的地址,则很可能仍然可以更改或修改变量数据。我的数据是可写的。解析器不能阻止(忽略)这种代码,因为它在c++中是完全合法的。
scanf("%d", &const_var);
如何锁定我的数据,使我的const数据不可修改(或不可写)?
在这种情况下…
scanf("%d", &foo); // Out of range!!!
…foo
确实可以被修改,或者几乎任何其他事情都可能发生。编译器无法捕捉到这一点,因为scanf
使用老式的c varargs
,它允许传递任意数量的任何类型的参数,而不进行任何检查。没有尝试确保传递的形参是一个地址,更不用说int型的地址,当然也不是非const int型的地址。
对于更安全的c++代码,请完全避免使用printf/sscanf
函数族。
Lint或其他源代码检查器可以在这里提供帮助。
c++不是一种安全的语言。在c++中,你只能保护自己不受意外事件的影响,而不能保护不忠的。如果用户想要更改他们不应该更改的东西,就像这样简单:
void SomeFunc(const Obj &dontChange)
{
Obj &change = const_cast<Obj &>(dontChange);
change.X = ...;
}
当用户决定违反你的代码和他们的代码之间的契约时,你无法保护自己。您只能保护自己免受用户意外试图破坏合同的伤害。甚至不能保护类的私有成员,因为它们可以简单地将类型强制转换为其他类型并直接访问内存。
你最好的办法是:别担心。如果用户对某个变量做了错误的事情,那么由此产生的任何破坏都是他们的错。
你不能直接保护自己不受这种情况的影响。如果常量被放入可写内存中,则总是可以获取该常量的地址并以这样或那样的方式修改它。但是,请记住,该标准规定,修改常数值被认为具有未定义行为。
如果你想让常量不可修改,你可以使用宏:
#define foo 100
这是一个技巧,因为它会将源代码中出现的所有foo
交换为100
,但是没有人能够在运行时修改它的值(根据定义,100是100)。
但是,我会避免使用宏。您可以使用另一种解决方法:定义一个函数:
constexpr int FooValue()
{
return 100;
}
没有人能够修改它,但是这个解决方案允许你在类或命名空间中嵌入这样的"常量"。如果您使用编译器,它可以处理c++ 11,使用constexpr将允许您在任何可能插入常量的地方输入此函数,例如:
int array[FooValue()];
- 具体来说,标准在哪里规定修改 const 对象是未定义的行为?
- C++ 为什么const X&可以通过功能进行修改?
- 修改C++中的"Const Char Pointers"
- 修改数据是否由 const shared_ptr&Ok 传递?
- const 方法使用引用修改对象
- 为什么 QObject::d isconnect(const QMetaObject::Connection &connection) 采用 const 参数并打算修改它?
- 有条件地传递修改后的副本而不是const原始副本变得丑陋
- 为什么当返回类型为 const 时可以修改返回值
- 为什么我可以在C 11中使用const函数修改类
- 是否允许在常量定义的对象上丢弃 const 只要它没有实际被修改?
- C++ 可以修改 const 对象的成员
- 修改 const 方法中的 pointee 值
- 临时修改const参数
- 使用引用修改Const对象
- 修改const形参引用
- 通过构造过程中获得的指针修改const对象
- 正在修改const声明对象上的可变对象的未定义行为
- 为什么我能够修改const变量通过类,而不是在纯代码.c++
- 标记所有不修改 const 的变量有什么缺点吗?
- 如何在c++中修改const引用