|
|
1
13
整整一节专门讨论这个问题 Const Correctness |
|
|
2
7
C++中的const正确性纯粹是一种确切地表达你意思的方式:
表示“我不会更改t引用的对象,如果我尝试更改,请编译器先生警告我”。 它不是一种安全特性,也不是(可靠地)创建只读对象的方法,因为使用C风格的强制转换进行颠覆很简单。 |
|
3
6
我打赌这是一个心态问题。我在和长期C++用户一起工作,并且注意到他们似乎在C++中思考(当然他们会这么做!)他们需要一段时间才能开始看到他们熟悉的答案的多个答案,从而得到像const correction这样的“股票”答案。给他们时间,试着温和地教育他们。 话虽如此,我确实喜欢C++的“const”保证方式。它主要是向用户承诺一个界面,对象、指针后面的数据或任何东西都不会被弄乱。我认为这是常数正确性的#1值#2值是编译器在优化方面可以允许的值。 当然,问题是,如果整个软件堆栈没有从一开始就考虑const。 我相信C#也有自己的一套范例。这说明了为什么“每年学习一门新的(计算或自然)语言”如此重要。只是为了锻炼一个人的思维,用其他的方式来看待世界,并解决它的问题。 |
|
|
4
4
使用常量正确性,可以将可变对象公开为只读对象 浪费宝贵的记忆(尤其是与收藏有关的)。我知道,有这个 CPU和内存都很便宜 桌面开发人员的理念,但在嵌入式世界仍然很重要。 此外,如果在C++中增加内存所有权的复杂性,那么最好不要复制包含或引用其他对象的非平凡对象,因此存在一种将现有对象暴露为只读的方法。 |
|
|
5
3
|
|
|
6
3
真正的答案是,即使你没有使用过它,也很难理解,那就是你失去了表达能力。这种语言有一些用C#无法表达的概念,它们有意义,它们是设计的一部分,但在翻译成代码时丢失了。 这不是一个答案,而是一个例子:
现在,在C#/Java中,您可以采用两种方法之一:要么为调用者创建一个副本以供使用(保证数据不会更改,但效率低下),要么返回对内部保存对象的引用(只是希望调用者不会通过setter更改数据)。 如果用户获取引用并通过它更改用作索引的字段,那么容器不变量将被破坏。
前面没有提到的第三个选项是使对象不可变,但它在任何地方都禁用更改。不允许对对象进行完全受控的更改,更改的唯一可能性是在执行更改的情况下创建新元素。这相当于时间和空间。 |
|
|
7
2
C++提供了很多方法来弄乱代码。我将const correction视为第一种有效的方法,将约束放入代码中,以控制“副作用”(不必要的更改)。 将参数标记为const(通常引用const对象或指向const对象的指针)将确保传递的对象不能更改,因此该函数/方法不会产生“副作用”。 将一个方法标记为const将保证该方法不会改变它所处理的对象的状态。如果是,编译器将生成一个错误。 标记const数据成员将确保数据成员只能在构造函数的初始化列表中初始化,并且不能更改。 此外,智能编译器可以使用常量作为各种性能优化的提示。
|
|
|
8
1
只要在编写代码时寻求编译器的帮助就足以让我提倡const正确性。但今天还有一个额外的优势:当您知道对象在哪里可以更改,在哪里不能更改时,多线程代码通常更容易编写。 |
|
|
9
1
很遗憾,C不支持C++的const正确性。我传递给函数的所有参数中有95%是常量,const特性保证通过引用传递的数据在调用后不会被修改。“const”关键字提供编译器检查的文档,这对大型程序有很大帮助。 |