我将与C ++谈一谈,这种区别最相关。
如您所正确指出的,不可变意味着对象在创建后根本无法更改。这种创建当然可以在运行时发生,即const
对象不一定是编译时常量。在C ++中,如果满足(1)和(2)或(3),则对象是不可变的:
它没有声明mutable
由const
成员函数突变的成员
宣布 const
const
成员函数不用于const_cast
删除const
资格以突变任何成员
但是,您也可以考虑使用访问修饰符:如果某个操作在内部对实例进行了更改,但对通过其公共接口可观察到的实例状态没有影响,则该对象是“逻辑上不可变的”。
因此,C ++提供了创建不可变对象所必需的工具,但是像C ++中的大多数其他工具一样,这些工具仅是最低限度的需求,并且需要勤勉地实际使用。实例的状态不一定限于实例成员变量,因为C ++没有提供强制引用透明的方法,它还可以包括全局或类状态。
const
在C ++中还具有另一个功能:限定引用和指针。甲const
参考可以指非const
对象。当且仅当该对象被声明为非-时,使用const_cast
该对象来通过const
引用对其进行突变是合法的(尽管通常不是必需的或不建议的):const
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
当然,改变const
对象是不确定的行为:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
const
并非每种语言都存在,并且并非每种语言都存在可变性和不变性,因此使这种语言成为对立语言并不适用。仅在这些概念适用的地方特定于语言。