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
,需要更改头的参数)const
在影响函数调用方方面“没有效果”——这就是为什么您应该将它们保留在标题之外——但它们可以使您的实现更健壮,更易于维护
显然,如果更改参数比将其复制到另一个局部变量更有用,那么不要为了这样做而将其设置为常量。与我的共同回答相反,我会将
字符设置为常量。毕竟,您不想在搜索过程中更改要查找的角色,是吗?由于无意中这样做很可能会弄乱您的算法,const
有助于使您的代码健壮且易于维护。只要您保持一致,这并不重要
正如你所看到的,这个问题是一个宗教问题。人们站在任何一方,倾向于强烈反对对方
任何一方都可以支持或反对。所提出的论点可能相互矛盾
例如,“makeit const”阵营中的论点倾向于认为,对于处理该函数的维护程序员来说,它使代码更加自我记录。这很可能是真的,您可能会认为这是将by-value参数标记为const的充分理由。然而,硬币的另一面是,您可能会决定某一天您确实需要修改函数中的变量,这将要求您更改签名或制作本地副本。此外,const为维护程序员添加了一些文档,它也为客户机程序员添加了文档,但这种文档充其量只是误导。它向调用方暗示了某些不存在的语义
但无论你做什么,你都需要考虑周全。要么将所有by-value参数设置为常量,要么不设置任何参数。反复无常会破坏你从任何一方获得的任何书面利益。Proconst
:
- 防止被调用方意外修改参数
Contraconst
:
- 在不向调用者提供有用信息的情况下添加混乱
- 实现更改(即删除限定符)将更改接口
理想的解决方案是仅在作为函数定义一部分的声明中提供常量。然而,C标准不允许这样做;但是,在所有合理的C语言实现中,它都会像预期的那样工作。同意,我倾向于删除这些没有意义且可能会混淆的常量