考虑这个函数声明:
int IndexOf(const char *, char);
其中char *是一个字符串,并在字符串中查找要查找的字符(如果未找到char,则返回-1,否则返回其位置)。使char成为const
是否有意义?我总是尝试在指针参数上使用const,但是当通过值调用某些东西时,我通常会将const留下。
你有什么想法?
答案 0 :(得分:4)
没有意义,因为如果修改第二个参数的值,调用者不会受到影响。
此外,如果你需要在函数内部修改这个参数,它可以帮助你在堆栈上保存几个字节,而不必声明一个单独的局部变量。
以下代码是修改参数而不是使用局部变量的一个很好的例子:
void foo (int count) {
while (count--) {
do_something();
}
}
但是,如果你的函数更长并且你不打算修改它的参数,那么在维护方面可能会奖励将相应的参数标记为const
,但仅限于其定义< / em>,而不是位于头文件中的声明。如果您以后决定参数不应该是const
,则只需在定义中更改它。
答案 1 :(得分:4)
假设您不打算调整任一参数的值:
我将函数定义为:
int IndexOf( const char * const , const char )
{
//...
}
但请将函数声明保持为:
int IndexOf( const char * , char );
换句话说:
我会在标题中显示{em>最低级别const
,但在投影中使用{em>最大可能级const
。< / p>
为什么?
const
参数,而不会触及标题(除了那些 {<1}},应该需要更改标题。)制作一个按值传递参数const
在影响函数调用者方面没有“效果” - 这就是为什么你应该将它们保留在标题之外 - 但它们可以使你的实现更强大,更易于维护。
显然,如果更改参数而不是将其复制到另一个局部变量更有用,那么不要为了这样做而使它const
。
答案 2 :(得分:4)
与我的合作伙伴相反,我会制作char
const
。毕竟,你不想在搜索中期改变你正在寻找的角色,对吗?由于这样做无意中很有可能弄乱你的算法,const
有助于使你的代码健壮且易于维护。
答案 3 :(得分:3)
对于您给出答案有意义的示例,但在更常见的传递值的情况下,可能存在const
可能有用的某些情况。
通常,这可能适用于非POD类型,其中甚至可能通过值传递并不保证更改不会产生可见的副作用。此外,如果您完全知道您的实现不想更改它,那么const
可以帮助编译器在/稍后有人意外更改该值时发现错误。
我倾向于遵守规则“将其标记为const
,除非有理由不将其const
”
答案 4 :(得分:2)
我认为没有必要,因为char的值会被复制,对它的任何更改都不会反映在其范围之外。
答案 5 :(得分:2)
没关系,只要你是一致的。
如你所见,这个问题是一个宗教问题。人们在任何一方下来,并且倾向于热切地反对对方。
可以支持或反对任何一方的争论。所提出的论点可能是矛盾的。
例如,“make it const”阵营中的参数倾向于认为它使代码更加自我记录,以供维护程序员使用该函数。这可能是真的,你可能会认为这是一个足够的理由将你的by-value参数标记为const。然而,这个硬币的另一面是你可能决定有一天你做需要修改函数中的变量,这需要你更改签名,或者制作本地副本。此外,哪个标记为const确实为维护程序员添加了一些文档,它还为客户端程序员添加了文档 - 但是这个文档充其量也是误导性的。它意味着调用者的某些语义不存在。
但无论你做什么,你都需要成为一个共识。要么将所有的by-value参数设为const,要么不设置它们。无意识会破坏你获得的任何文件利益。
答案 6 :(得分:1)
如果它是3行函数,则const
没有多大帮助。
但是如果你必须理解并维护一个300行函数,那么在使用它之前的第289行之前,局部变量或参数不会被改变是一个非常重要的线索。
答案 7 :(得分:1)
专业const
:
Contra const
:
理想的解决方案是仅在声明中提供const
,该声明是函数定义的一部分。但是,C标准不允许这样做;但是,它将在C语言的所有合理实现中按预期工作。
答案 8 :(得分:0)
我会说const
绝对不会给你的代码添加任何内容。