如何在C ++中创建简单的immutable int?我有一个功能:
int NOD(const int &a, const int &b) {
if (b == 0) {return a;}
const int remainder = a % b;
return NOD(b, remainder);
}
应该采取两个整数并返回最大公约数。但是我没有找到一种方法来使a和b不可变,因此它们可以在函数内被改变,例如,如果我们在函数中添加一行:
*(int *)&a = 555;
它破坏了一切。如何在C ++中创建不可变变量?
答案 0 :(得分:2)
你在谈论整数。只需通过省略引用符号来复制它们,并且对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);
}
答案 1 :(得分:-1)
您的代码正在调用未定义的行为,之后所有都可以。所以,你所要求的是不可能的 - 在UB之后,即使是不可变的变量也是可变的。
答案 2 :(得分:-2)
您永远不能禁止一段代码更改其原始数据类型的本地副本,这应该是明确的。这在函数式语言中也是如此。
C ++的方法可能是将int包装成一个只有一个构造函数采用int而且只有const方法来读取内容的类。
如果你让这个单独的构造函数不能被“其他人”访问,那么他们将无法自己构建一个更改的对象。
或者你可以返回一个返回int的lambda表达式。在编译器内部,它会动态生成类的实例。从表面上讲,这应该是相同的,但可能不那么笨拙。