如何使自己的"const data"不可修改?

How to make my own "const data" unmodifiable?

本文关键字:修改 const 何使 自己的 data      更新时间:2023-10-16

我自己的 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()];