C++ 中的不可变整数
Immutable int in C++
如何在 C++ 中创建简单的不可变 int?我有一个功能:
int NOD(const int &a, const int &b) {
if (b == 0) {return a;}
const int remainder = a % b;
return NOD(b, remainder);
}
应该取两个整数和 returns 最大公约数。但是我没有找到使 a 和 b 不可变的方法,因此可以在函数内更改它们,例如,如果我们在函数中添加一行:
*(int *)&a = 555;
它打破了一切。如何在 C++ 中创建不可变变量?
您永远不能禁止一段代码更改其原始数据类型的本地副本,这一点应该很清楚。这在函数式语言中也是一样的。
C++ 方法可能是将 int 包装到一个 class 中,该 class 只有一个构造函数采用 int 并且只有 const 方法来读取内容。
如果您让 "others" 无法访问此单个构造函数,那么他们将无法自行构建更改后的对象。
或者您可以 return 一个 lambda 表达式,return 是 int。在内部,编译器会动态生成一个 class 的实例。从性能上看,这应该大致相同,但阅读起来可能不那么笨拙。
您的代码正在调用未定义的行为,之后一切都是可能的。所以,你问的是完全不可能的 - 在 UB 之后,即使是不可变的变量也是可变的。
你说的是整数。只需通过省略引用符号来复制它们,对 a 和 b 的所有可能更改对于 NOD 函数都是局部的。使用引用通常有两个原因。一,你想改变它们(但你不需要在这里)。其次,有时参考比副本提供更多的性能。但这里的情况并非如此,因为整数与 C/C++.
中的东西一样便宜
int NOD(int a, int b) {
if (b == 0) {return a;}
const int remainder = a % b;
return NOD(b, remainder);
}
如何在 C++ 中创建简单的不可变 int?我有一个功能:
int NOD(const int &a, const int &b) {
if (b == 0) {return a;}
const int remainder = a % b;
return NOD(b, remainder);
}
应该取两个整数和 returns 最大公约数。但是我没有找到使 a 和 b 不可变的方法,因此可以在函数内更改它们,例如,如果我们在函数中添加一行:
*(int *)&a = 555;
它打破了一切。如何在 C++ 中创建不可变变量?
您永远不能禁止一段代码更改其原始数据类型的本地副本,这一点应该很清楚。这在函数式语言中也是一样的。
C++ 方法可能是将 int 包装到一个 class 中,该 class 只有一个构造函数采用 int 并且只有 const 方法来读取内容。
如果您让 "others" 无法访问此单个构造函数,那么他们将无法自行构建更改后的对象。
或者您可以 return 一个 lambda 表达式,return 是 int。在内部,编译器会动态生成一个 class 的实例。从性能上看,这应该大致相同,但阅读起来可能不那么笨拙。
您的代码正在调用未定义的行为,之后一切都是可能的。所以,你问的是完全不可能的 - 在 UB 之后,即使是不可变的变量也是可变的。
你说的是整数。只需通过省略引用符号来复制它们,对 a 和 b 的所有可能更改对于 NOD 函数都是局部的。使用引用通常有两个原因。一,你想改变它们(但你不需要在这里)。其次,有时参考比副本提供更多的性能。但这里的情况并非如此,因为整数与 C/C++.
中的东西一样便宜int NOD(int a, int b) {
if (b == 0) {return a;}
const int remainder = a % b;
return NOD(b, remainder);
}