arc*_*pus 12 c++ const parameter-passing
学习C++时,学习函数概念的第一个函数之一就是
int add(int a, int b)
{
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道:我应该在const这里使用-keyword,或者更确切地说不是,因此
int add(const int a, const int b)
{
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
但那会有意义吗?它会加速我的程序,做一些其他重要的事情,或只是增加混乱?
Mr.*_*C64 15
从调用者的角度来看,第一种和第二种形式都是相同的.
由于整数传递的价值,即使函数修改a和b,修改后的值是副本原件并不会给调用者可见.
但是,从功能实现者的角度来看,存在差异.事实上,在第二种形式:
Run Code Online (Sandbox Code Playgroud)int add(const int a, const int b)
如果您尝试修改函数体内部a和b内部的值,则会出现编译器错误,因为它们被标记为const.
相反,如果省略,则可以更改这些值const.
同样,调用者不会看到这些修改.
使用int add(const int a, const int b)意味着您无法修改函数体内的输入参数.
也许编译器可以基于此进行一些优化,因此它应该永远不会比非等效的慢const.但我从未在实践中观察到这种效应.
传递const参数还可以提高代码库的稳定性,尤其是在协作项目中.
尽管如此,我发现它太冗长,相当不必要,而且会使用int add(int a, int b).偶尔,对于特别长的函数,我利用了这样一个事实:你可以用非参数声明函数const,并用参数定义它const.
如果您真的在代码库中遇到正确的错误const,那么就会有所帮助,然后添加const.
也就是说,您应该考虑相关问题.函数参数的顶级限定符不是函数类型的一部分,因此您的函数类型仍然只是int(int, int).(限定词只影响在函数定义的参数变量).这意味着任何声明的功能也忽略了预选赛,所以int add(int, int)并int add(const int, int)和int add(int, const int)所有声明同样的功能.因此,您必须决定如何编写头文件的策略.现在,您可以采取三个基本立场:
始终符合声明和定义.好处是,这可能使代码看起来"一致"(在创建实现时想想复制/粘贴).缺点是限定符与接口无关,并且完全不可执行(您可以稍后更改定义!),所以最好是噪声,最坏的情况是错误的.
符合定义,但不符合其他声明.好处是,它正确地传达了接口,你仍然可以在定义中进行const检查.缺点是有些人可能会对拼写上的差异感到困惑.(就像人们可能会混淆static constexpr T foo;可以定义类成员一样const T C::foo;.)
不合格.好处是它一致,干净,易于记忆和最小化.缺点是您错过了定义中的正确性检查.
没有正确的答案.如果您是代码库所有者或项目负责人,则应根据代码库和团队中的最大问题来决定.(我的个人立场是坚持(3),直到你有充分的理由改变.)