const
当不应该修改变量的值时,我正在阅读的许多书都使用关键字。除了向代码的读者指定如果您修改此变量可能会导致错误的代码(您可以使用注释来做到这一点),为什么还需要将该关键字作为任何编程语言的一部分?在我看来,如果您不想修改变量,那就根本不要。
有人可以帮我澄清一下吗?
const
当不应该修改变量的值时,我正在阅读的许多书都使用关键字。除了向代码的读者指定如果您修改此变量可能会导致错误的代码(您可以使用注释来做到这一点),为什么还需要将该关键字作为任何编程语言的一部分?在我看来,如果您不想修改变量,那就根本不要。
有人可以帮我澄清一下吗?
const
两者都有。
const
对于从未犯错误的程序员,省略将非常有效。
const
指定符将为编译器和链接器提供将值的地址映射到内存的EPROM部分而不是RAM中的选项。多年前,我在一个针对预分配的静态变量具有此行为的系统上工作(在const
引入关键字之前)。
Answers:
除了指定代码阅读者之外,如果您修改此变量,可能会导致错误(您可以使用注释来执行此操作)
不是“可以”;会导致程序错误。
strchr
,并且它具有一些相当宽松的隐式转换规则,可以使您放弃const
ness而不很容易地实现它。但是,仅仅因为您获得了成功的编译并不意味着您就没有错误。不幸的是,这确实意味着错误可能是程序中的细微错误,也可能是巨大的异常崩溃。无论哪种方式,都可以确保您的程序中包含错误。
在我看来,如果您不想修改变量,那就根本不要。
好吧,这很好,但是没有人是完美的。程序员会犯错误。这使编译器(永远不会(至少通常不会)犯错误)可以向您指出错误。
当您使用一些数据变量而不是创建它的地方时,它特别有用。距离越远,修改它就越容易,而又不会意识到您不应该这样做。对于大型,复杂的代码库,这只是必须的。
您可以在代码库中获得一种新的可证明性,正确性和稳定性的度量,并且可以消除造成真正细微和令人讨厌的错误的可能原因。当您知道某些值在编译后不会改变的情况下,对于编译器来说(在某些情况下)还有大量的优化机会。
我们可以整天列出这些优势,但是,实际上,直到您开发了这样的代码库,您都不会完全理解它。
实际上,在理想情况下,所有变量都const
默认为,并且您需要使用关键字mutable
对其进行声明才能进行更改。C ++倒退了。
var
来声明非可变变量。
至少在C ++中,const
它的用途不只是向其他程序员记录您的意图。
const
还可以告诉编译器一些事情。例如,带有引用的函数,例如:void f(T &t);
不能接受临时对象作为其参数。为此,您需要对const
参考进行限定,例如:void f(T const &t)
。
同样,要在const对象上调用成员函数,必须对成员函数进行const
限定,例如:void T::foo() const {}
。
在嵌入式系统中,它const
可能意味着更多,可能会告诉编译器有关对象的位置(将其放入ROM与RAM中)。const
本身并不一定足以告诉它“将这个对象放入ROM”,但是它通常仍然是先决条件。
同样(在C ++ 11下)const
告诉编译器线程安全。
现在,毫无疑问,您可以定义某种其他语言(以其他方式)与没有const
以这些方式使用的C或C ++类似。结果将是一种与两种语言截然不同的语言。在不知道您的意图的情况下,无法说出结果如何,但是最终可能会更接近Java或C#(在两个示例中),它们在某种程度上都与C和C ++相似,但并非如此。一个(即不要const
像C和C ++那样使用)。
const
我记得,Java根本不使用。(我认为这是一个保留字,但不能用于任何内容。)其final
关键字相似但不完全相同。C#具有const
,但是不一样。(我认为它基本上只相当于#define
s。)
除了在其他答案中已经讨论过的常规编程注意事项之外,与我有关的一件事是态度:
在我看来,如果您不想修改变量,那就根本不要。
一般的经验法则是,在开发阶段花费了20%的代码编写成本。其余80%花费在代码的整个生命周期中,包括对其进行升级,维护等。这意味着除您之外,还有许多其他人将在您的代码上工作。
在开发过程中花费的时间可以避免几年后出现的问题,这是一笔不错的投资。这项工作包括:撰写评论;定义为常数的常数;并编写不依赖模糊语言构造的显式代码。
另外,@ worlboss,我听到了相当多的不宽容。正如其他人所评论的那样,碳单元会出错,而硅单元可以帮助避免错误的任何事情都值得赞赏。
两个原因:
这里是一个很好的解释,从伊恩·兰斯·泰勒(谁在工作gcc
和gold
链接):
const的第一个含义对程序有实际影响。声明为const的变量可以与未声明为const的变量进行不同的编译。
另一方面,const的第二个含义实际上是编译器强制执行的文档。如果尝试使用const限定指针更改值,则编译器将发出错误,但声明此类指针不会更改生成的代码。
const
只会使用指针参数
const
实际上在声明中对参数(无论它们是否是指针无关紧要)被(语言)忽略了;您在说的是在声明中应用于const
基础指针对象类型而不是函数参数类型本身,因为这毫无意义。它仅对const
函数定义中的局部性有用。那么,它对API有什么影响呢?
[C++11: 8.3.5/3]:
[..]生成参数类型列表后,在形成函数类型时,将删除所有修改参数类型的顶级cv限定词。[..]
[C99: 6.7.5.3/15]:
[..](在确定类型兼容性和复合类型时,以函数或数组类型声明的每个参数均被视为具有调整后的类型,以限定类型声明的每个参数均被视为具有其声明类型的非限定版本。)[..]
const
秒。在功能定义中重新应用无关。
这是一个简单的C示例:
void PrintList(const struct List *l);
void SortList(struct List *l);
int CmpList(const struct List *a, const struct List *b);
void AppendList(struct List *l, struct List *m);
void PushList(struct List *l, struct ListNode *n);
void PopList(struct List *l, struct ListNode *n);
在这里,我们有一小组的功能可以使用某种类型的节点列表。首先,即使不知道函数的名称,我们也可以立即看到哪些函数以某种方式更改了列表,而哪些没有。const
就像标准库中的函数一样,这些函数不会更改您的数据,并且不允许您使用它们来更改数据。C编译器尝试保持对const
传递给函数的数据的指针的-ness强制。因此,在这种情况下,我可以合理地确定在进行运行时调试时比较两个列表不是使它们混乱的功能,因为我已经保护自己免受意外修改数据的影响。;)
关键字const
对于团队和长期项目非常有用。我会给你几个例子,这些例子应该说明const
关键字的值。
可以说现在我正在创建将用于进一步项目的lib。因此,这意味着今天编写的代码需要在几年后得到信任,在这样的一段时间内,我会忘记不应修改哪个变量(同事甚至都不知道可以修改什么,不能修改什么)。因此,此简短示例说明了为什么要使用const
。
谈论评论,当最后期限到来时,还有很多东西仍然无法在每个功能上发表评论,这只会浪费时间。但是,在某些情况下,注释是必须的,因为第一个问题(截止日期)可能无法读取注释,因为大多数注释无用,但重要的注释也将被跳过。因此,最好使用const
关键字,它会导致编译错误并指出问题所在,然后编写和阅读大量注释。
这是一个棘手的问题,因为IMO是基于信念的。这些信念之一是,您可以仅添加更多代码就可以保护代码免受某些更改。当然,编译器会使用多余的代码来检查所有内容。
我认为这并不总是正确的,您无法保护自己或自己的开发团队免受代码或仅添加关键字的开发团队的侵害,实际上,有许多语言没有任何const,public,private,protected,internal,int,float, double关键字,但这并不意味着它们不是良好的语言。
某些代码模式也会发生同样的情况,为什么人们浪费太多时间讨论Singletons !?如果您只想拥有一个实例,那么唯一要做的就是创建一个实例,仅此而已。同样的想法无处不在,看看10年前发表的防御性编程文章,再来看看用代码保护代码的想法。
在某些时候,您必须决定要在哪里设置责任,是在开发人员手上还是在编译人员手上。但是,编译器和任何其他工具都无法将代码保存在开发人员手中,因此许多关键字毫无用处,或者只是与其他开发人员进行交流的一种方式。
常量变量只允许您编写更具可读性的代码。
const
在几乎所有语言中,最常用的用法是允许我们使用名称来引用常量值,因此您可以使用流利的语言告诉其他人该名称的含义,而无需在代码中散布注释并节省时间和精力从读者那里了解参数的类型和参数的特殊性。当然,如果常量值在代码中重复使用,您也会从中受益。好吧,这样的代码可以更具可读性:
processPages(LETTER_PAPER_WIDTH, LETTER_PAPER_HEIGHT);
...比这个:
processPages(215.9, 279.4); // 8.5 x 11 Inches in millimeters for Letter Papers
在上面的示例中,您需要了解每个参数的含义,其单位和解释值的类型,并且还需要针对注释进行验证,因为这样的冗余注释(那些重放编码内容的注释)不是可靠且有用的评论(根据“干净代码:http://goo.gl/5EyY”中的Robert Martin来说,这是不好的评论)。
考虑这样一种情况:您在整个项目中多次使用相同的常量,并且在所有位置都对其进行硬编码。现在突然需要将常量的值更改为另一个值,因此在所有位置进行更改都非常麻烦。
因此,我认为使您的代码更具可维护性绝对是原因之一。