Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何做我自己的;“常数数据”;不可修改?_C++_Reference_Constants - Fatal编程技术网

C++ 如何做我自己的;“常数数据”;不可修改?

C++ 如何做我自己的;“常数数据”;不可修改?,c++,reference,constants,C++,Reference,Constants,我自己的const属性有问题。由于函数的原因,我无法完全保护常量数据。函数可以修改一切 const reference是一件可怕的事情,因为它需要一个地址;如果它是常量变量的地址,则变量数据很可能仍然可以更改或修改。我的数据是可写的。解析器无法防止(忽略)这种代码,因为它在C++中是完全合法的。 scanf("%d", &const_var); 如何锁定我的数据并使我的常量数据不可修改(或不可写入)?您无法直接保护自己免受此类情况的影响。如果常数放在可写内存中,人们可能总是获取该常数的

我自己的
const
属性有问题。由于函数的原因,我无法完全保护常量数据。函数可以修改一切

const reference
是一件可怕的事情,因为它需要一个地址;如果它是常量变量的地址,则变量数据很可能仍然可以更改或修改。我的数据是可写的。解析器无法防止(忽略)这种代码,因为它在C++中是完全合法的。
scanf("%d", &const_var);

如何锁定我的数据并使我的常量数据不可修改(或不可写入)?

您无法直接保护自己免受此类情况的影响。如果常数放在可写内存中,人们可能总是获取该常数的地址并以某种方式修改它。不过,该标准指出,请记住,修改常量值被视为具有未定义的行为

如果希望常量不可修改,可以采取变通办法并使用宏:

#define foo 100
这是一个技巧,因为它将把源代码中所有出现的
foo
转换为
100
,但是没有人能够在运行时修改它的值(根据定义,100是100)

但是,我会避免使用宏。您可以使用另一种解决方法:定义函数:

constexpr int FooValue()
{
    return 100;
}
也没有人能够修改它,但这个解决方案允许您在类或命名空间中嵌入这样的“常量”。如果您使用可处理C++11的编译器,则使用constexpr将允许您在任何地方输入此函数,您可以在其中插入常量,例如:

int array[FooValue()];

你不能直接保护自己不受这种情况的影响。如果常数放在可写内存中,人们可能总是获取该常数的地址并以某种方式修改它。不过,该标准指出,请记住,修改常量值被视为具有未定义的行为

如果希望常量不可修改,可以采取变通办法并使用宏:

#define foo 100
这是一个技巧,因为它将把源代码中所有出现的
foo
转换为
100
,但是没有人能够在运行时修改它的值(根据定义,100是100)

但是,我会避免使用宏。您可以使用另一种解决方法:定义函数:

constexpr int FooValue()
{
    return 100;
}
也没有人能够修改它,但这个解决方案允许您在类或命名空间中嵌入这样的“常量”。如果您使用可处理C++11的编译器,则使用constexpr将允许您在任何地方输入此函数,您可以在其中插入常量,例如:

int array[FooValue()];
在这种情况下

scanf("%d", &foo); // Out of range!!!
foo
确实可以被修改,或者几乎任何其他事情都可能发生。编译器无法捕捉到这一点,因为
scanf
使用旧式的c
varargs
,它允许传递任意数量、任意类型的参数,而不进行任何检查。没有人试图确保传递的参数是地址,更不用说int的地址,当然也不是非常量int的地址

对于安全的C++代码,避免完全使用<代码> Prtff/ScSnf函数族。p> Lint或其他一些源代码检查器可以在这里提供帮助。我还没有试过这个特殊的案例。

在这个案例中

scanf("%d", &foo); // Out of range!!!
foo
确实可以被修改,或者几乎任何其他事情都可能发生。编译器无法捕捉到这一点,因为
scanf
使用旧式的c
varargs
,它允许传递任意数量、任意类型的参数,而不进行任何检查。没有人试图确保传递的参数是地址,更不用说int的地址,当然也不是非常量int的地址

对于安全的C++代码,避免完全使用<代码> Prtff/ScSnf函数族。p>


Lint或其他一些源代码检查器可以在这里提供帮助。我还没有在这个具体案例中尝试过。C++不是一种安全的语言。在C++中,你只能保护自己不受意外伤害。如果用户想要更改一些他们本不应该更改的内容,可以这么简单:

void SomeFunc(const Obj &dontChange)
{
  Obj &change = const_cast<Obj &>(dontChange);

  change.X = ...;
}
void SomeFunc(const Obj&dontChange)
{
Obj&change=const_cast(不改变);
change.X=。。。;
}
您无法保护自己不受用户的伤害,因为用户决定违反您的代码与他们的代码之间的约定。您只能保护自己不受意外试图违反合同的用户的伤害。您甚至不能保护类的私有成员,因为他们可以简单地将类型转换为其他类型,并直接戳内存


你最好的选择是:别担心。如果用户对某个变量做了错误的操作,那么由此产生的任何破坏都是他们的错误。

C++不是一种安全的语言。在C++中,你只能保护自己不受意外伤害。如果用户想要更改一些他们本不应该更改的内容,可以这么简单:

void SomeFunc(const Obj &dontChange)
{
  Obj &change = const_cast<Obj &>(dontChange);

  change.X = ...;
}
void SomeFunc(const Obj&dontChange)
{
Obj&change=const_cast(不改变);
change.X=。。。;
}
您无法保护自己不受用户的伤害,因为用户决定违反您的代码与他们的代码之间的约定。您只能保护自己不受意外试图违反合同的用户的伤害。您甚至不能保护类的私有成员,因为他们可以简单地将类型转换为其他类型,并直接戳内存


你最好的选择是:别担心。如果用户对某个变量做了错误的操作,那么由此产生的任何破坏都是他们的错误。

我对此没有任何意义。我认为你需要更清楚地沟通。值得注意的是,这里似乎没有任何引用。只是不要使用像
scanf
这样的函数通过
..
传递参数。您所说的“可避免”是什么意思?至于scanf,它是一个varargs函数,所以