免责声明:我知道关于 const 正确性的有用性有两个问题,但是,没有人讨论与其他编程语言相比,在 C++ 中如何需要 const 正确性。另外,我对这些问题的答案不满意。
我现在已经使用了几种编程语言,而在 C++ 中困扰我的一件事是 const 正确性的概念。在 Java、C#、Python、Ruby、Visual Basic 等中没有这样的概念,这似乎是 C++ 特有的。
在您向我推荐 C++ FAQ Lite 之前,我已经阅读了它,但它并不能说服我。完全有效、可靠的程序一直都是用 Python 编写的,并且没有 const 关键字或等效关键字。在 Java 和 C# 中,对象可以声明为 final(或 const),但没有 const 成员函数或 const 函数参数。如果一个函数不需要修改一个对象,它可以采用一个只提供对该对象的读取访问的接口。该技术同样可以在 C++ 中使用。在我研究过的两个真实世界的 C++ 系统上,几乎没有在任何地方使用 const,而且一切正常。所以我对让 const 污染代码库的用处还很远。
我想知道在 C++ 中是什么使 const 成为必要,而不是其他编程语言。
到目前为止,我只看到了一种必须使用 const 的情况:
#include <iostream>
struct Vector2 {
int X;
int Y;
};
void display(/* const */ Vector2& vect) {
std::cout << vect.X << " " << vect.Y << std::endl;
}
int main() {
display(Vector2());
}
Visual Studio 接受使用注释掉的 const 进行编译,但使用警告C4239,使用非标准扩展。所以,如果你想要传递临时变量、避免复制和保持标准兼容的语法简洁,你必须通过 const 引用传递,没有办法绕过它。尽管如此,这更像是一个怪癖而不是根本原因。
否则,实际上没有必须使用 const 的情况,除非与使用 const 的其他代码交互。在我看来,Const 只不过是一种自以为是的瘟疫,它蔓延到它所触及的一切:
const 在 C++ 中起作用的原因是你可以抛弃它。如果你不能把它扔掉,那么你的世界就会糟透了。如果你声明一个接受 const Bla 的方法,你可以传递一个非常量 Bla。但是如果反过来就不行了。如果您声明一个采用非常量 Bla 的方法,则不能将其传递给 const Bla。所以现在你被卡住了。所以你逐渐需要一个非 const 的东西的 const 版本,你最终会得到一个影子世界。在 C++ 中你可以摆脱它,因为与 C++ 中的任何东西一样,无论你是否想要这个检查都是完全可选的。如果你不喜欢它,你可以把它打掉。
Anders Hejlsberg(C# 架构师),CLR 设计选择