C++'s const is not a good comparison. The constness is too shallow. Pointers can still mutate other data, including the object itself.
In other languages you often create a new value. Haskell has special syntax for updating some fields while keeping all the rest. Without that it can be quite annoying, especially when there are many fields.
Rust makes use of move operations to avoid unnecessary object creations. The compiler prevents you from accidentally accessing the value afterwards and you can also create multiple values of the same name in the same scope. If useful, you can write
| let foo = bar();
let foo = modify(foo); // foo is moved into modify and the return value is bound to the name foo again
|