C++ 使char函数参数常量?

C++ 使char函数参数常量?,c++,c,C++,C,考虑这个函数声明: int IndexOf(const char *, char); 其中char*是一个字符串,char是要在字符串中查找的字符(如果未找到该字符,则返回-1,否则返回其位置)。将字符也设置为常量有意义吗?我总是尝试在指针参数上使用const,但当通过值调用某个对象时,我通常不使用const 您的想法是什么?这没有意义,因为如果您修改第二个参数的值,调用方不会受到影响 此外,如果需要在函数内部修改此参数,它可能会帮助您在堆栈上节省一些字节,而不必声明单独的局部变量 下面的代码

考虑这个函数声明:

int IndexOf(const char *, char);
其中char*是一个字符串,char是要在字符串中查找的字符(如果未找到该字符,则返回-1,否则返回其位置)。将字符也设置为常量有意义吗?我总是尝试在指针参数上使用const,但当通过值调用某个对象时,我通常不使用const


您的想法是什么?

这没有意义,因为如果您修改第二个参数的值,调用方不会受到影响

此外,如果需要在函数内部修改此参数,它可能会帮助您在堆栈上节省一些字节,而不必声明单独的局部变量

下面的代码是修改参数而不是使用局部变量的一个很好的示例:

void foo (int count) {
  while (count--) {
    do_something();
  }
}

但是,如果您的函数较长,并且不打算修改其参数,则在维护方面,将相应的参数标记为
const
,这可能是有益的,但仅限于其定义,而不是位于头文件中的声明。如果你后来决定一个参数不应该是常量,你只需要在定义中修改它。

我认为没有必要,因为char的值将被复制,对它的任何更改都不会反映在其范围之外。

我想说
const
绝对不会给代码添加任何内容。

对于您给出的示例,答案是有意义的,但是在更一般的按值传递的情况下,
const
可能会有帮助

通常情况下,这可能适用于非POD类型,在这些类型中,即使传递值也不能保证更改不会产生明显的副作用。此外,如果您完全知道您的实现不想更改它,那么在以后有人意外更改值时标记它
const
可以帮助编译器发现错误


我倾向于按照规则“标记它
const
,除非有理由不将其标记为
const

如果它是一个三行函数,那么
const
没有多大帮助


但是,如果您必须理解并维护300行函数,那么在使用第289行之前不会更改局部变量或参数,这可能是一条非常重要的线索。

假设您不打算调整任一参数的值:

我将函数定义为:

int IndexOf( const char * const , const char )
{
    //...
}
但将函数声明保留为:

int IndexOf( const char * , char );
换句话说:
我会在标题中显示
const
的最低级别,但在实现中使用
const
的最高级别

为什么?

  • 将头和实现分开,允许我在不接触头的情况下更改实现中的
    const
    参数(除了那些非常
    const
    ,需要更改头的参数)
  • 这使得代码更加自我记录
  • 如果编译器不将错误捕获为错误,那么引入错误就会变得更加困难
  • 这使得其他程序员在将来进行更改时更难引入bug
  • 设置或不设置传递值参数
    const
    在影响函数调用方方面“没有效果”——这就是为什么您应该将它们保留在标题之外——但它们可以使您的实现更健壮,更易于维护


    显然,如果更改参数比将其复制到另一个局部变量更有用,那么不要为了这样做而将其设置为常量。

    与我的共同回答相反,我会将
    字符设置为常量。毕竟,您不想在搜索过程中更改要查找的角色,是吗?由于无意中这样做很可能会弄乱您的算法,
    const
    有助于使您的代码健壮且易于维护。

    只要您保持一致,这并不重要

    正如你所看到的,这个问题是一个宗教问题。人们站在任何一方,倾向于强烈反对对方

    任何一方都可以支持或反对。所提出的论点可能相互矛盾

    例如,“makeit const”阵营中的论点倾向于认为,对于处理该函数的维护程序员来说,它使代码更加自我记录。这很可能是真的,您可能会认为这是将by-value参数标记为const的充分理由。然而,硬币的另一面是,您可能会决定某一天您确实需要修改函数中的变量,这将要求您更改签名或制作本地副本。此外,const为维护程序员添加了一些文档,它也为客户机程序员添加了文档,但这种文档充其量只是误导。它向调用方暗示了某些不存在的语义


    但无论你做什么,你都需要考虑周全。要么将所有by-value参数设置为常量,要么不设置任何参数。反复无常会破坏你从任何一方获得的任何书面利益。

    Pro
    const

    • 防止被调用方意外修改参数
    Contra
    const

    • 在不向调用者提供有用信息的情况下添加混乱
    • 实现更改(即删除限定符)将更改接口

    理想的解决方案是仅在作为函数定义一部分的声明中提供
    常量。然而,C标准不允许这样做;但是,在所有合理的C语言实现中,它都会像预期的那样工作。

    同意,我倾向于删除这些没有意义且可能会混淆的常量