C ++中的不可变int

时间:2016-09-27 07:00:53

标签: c++ functional-programming immutability

如何在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 ++中创建不可变变量?

3 个答案:

答案 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表达式。在编译器内部,它会动态生成类的实例。从表面上讲,这应该是相同的,但可能不那么笨拙。