相关疑难解决方法(0)

为什么const-correctness特定于C++?

免责声明:我知道有两个关于const-correctness有用的问题,但是,没有人讨论过如何在C++中使用const-correctness 而不是其他编程语言.此外,我对这些问题的答案不满意.

我现在使用了一些编程语言,在C++中让我烦恼的一件事就是const-correctness的概念.在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());
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio接受使用const注释掉的编译,但是使用警告C4239时,使用非标准扩展.所以,如果你想要传递临时代码,避免副本和保持标准兼容的语法简洁,你必须通过const引用,不管它.不过,这更像是一个怪癖,而不是一个根本原因.

否则,实际上不存在必须使用const的情况,除非与使用const的其他代码连接.在我看来,康斯特似乎不是一个自以为是的瘟疫,它蔓延到它接触到的一切:

const在C++中工作的原因是因为你可以把它丢弃.如果你不能把它扔掉,那么你的世界就会糟透了.如果声明一个采用const Bla的方法,则可以将它传递给非const Bla.但如果是相反的方式你不能.如果声明一个采用非const Bla的方法,则不能将它传递给const Bla.所以现在你被卡住了.所以你逐渐需要一个不是const的所有东西的const版本,你最终得到了一个阴影世界.在C++中,你可以使用它,因为与C++中的任何东西一样,无论你是否想要这个检查,它都是纯粹可选的.如果你不喜欢它,你可以打破常量.

Anders Hejlsberg(C#架构师),CLR设计选择

c++ const const-correctness

40
推荐指数
7
解决办法
7237
查看次数

为什么从Java和C#中删除const?

我知道这已经多次讨论了,但我不确定我是否真的理解为什么 Java和C#设计者选择从这些语言中省略这个功能.我对如何制定变通方法(使用接口,克隆或任何其他替代方法)不感兴趣,而是对决策背后的基本原理感兴趣.

从语言设计的角度来看,为什么这个功能被拒绝了?

PS:我正在使用诸如"省略"之类的词语,有些人可能觉得这些词语不合适,因为C#是用加法(而不是减法)方法设计的.但是,我使用这样的词是因为在设计这些语言之前C++中存在这个特性,所以从程序员的工具箱中删除它就省略了.

c# c++ java language-features programming-languages

12
推荐指数
2
解决办法
798
查看次数