制作char函数参数const?

时间:2010-12-21 13:49:38

标签: c++ c

考虑这个函数声明:

int IndexOf(const char *, char);

其中char *是一个字符串,并在字符串中查找要查找的字符(如果未找到char,则返回-1,否则返回其位置)。使char成为const是否有意义?我总是尝试在指针参数上使用const,但是当通过值调用某些东西时,我通常会将const留下。

你有什么想法?

9 个答案:

答案 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>

为什么?

  1. 分隔标题和implimentation允许我更改implimentation中的const参数,而不会触及标题(除了那些 {<1}},应该需要更改标题。)
  2. 这使得代码更加自我记录。
  3. 如果没有编译器将错误视为错误,就很难引入错误。
  4. 这使其他程序员更难以在进行更改时引入错误。
  5. 制作一个按值传递参数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绝对不会给你的代码添加任何内容。