const正确性如何帮助编写更好的程序?

Pop*_*lin 2 c# c++ const-correctness

这个问题来自C#人问C++人.(我知道一点C,但只有一些C++的一般知识).

来到C#的C++开发人员说他们错过了const的正确性,这对我来说似乎很奇怪.在.Net中,为了禁止更改您需要创建不可变对象或具有只读属性/字段的对象,或者传递对象副本(默认情况下复制结构).

C++ const是否正确,是一种创建不可变/只读对象的机制,还是有更多呢?如果目的是创建不可变/只读对象,那么可以在像.Net这样的环境中完成同样的事情.

dir*_*tly 13

常见问题解答中有一节专门讨论Const Correctness.请享用!


小智 7

C++中的const正确性只是一种确切地说出你的意思的方式:

void foo( const sometype & t ) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

他说:"我不会改变t提到的对象,如果我试着,请Compiler先生警告我这件事".

它不是安全功能或(可靠地)创建只读对象的方式,因为使用C样式转换来破坏它是微不足道的.


aka*_*ppi 6

我打赌这是心态问题.我正在和很长时间的C++人一起工作,并注意到他们似乎用C++思考(当然他们这样做了!).他们需要一段时间才能开始看到他们熟悉的答案的多个答案,以获得像'正确'这样的'股票'答案.给他们时间,并尝试轻轻地教育他们.

话虽如此,我确实喜欢C++'const'的保证方式.它主要是承诺接口的用户,对象,指针后面的数据或任何不会被搞乱的东西.我会将此视为const正确性的#1值.#2值是编译器在优化方面可以允许的.

当然,问题是如果整个sw堆栈还没有从头开始构建const.

我敢肯定C#有自己的一套范例来做同样的事情.这说明为什么"每年学习一门新的(计算或自然)语言"非常重要.只需锻炼一个人对其他方式的看法,就可以看到这个世界,并解决它的问题.