const正确性的价值参数
-
19-09-2019 - |
题
我知道大约有const正确性其中规定,一个函数的声明和它的定义并不需要同意的价值参数几个问题。这是因为值参数的常量性只在函数内部事项。这是细:
// header
int func(int i);
// cpp
int func(const int i) {
return i;
}
时真的这样做的最佳做法?因为我从来没有见过任何人这样做。我已经看到了这个报价(不知道来源的)在其他地方这个已经讨论:
“事实上,编译器,函数签名是相同的你是否包括该常量中的值参数的前或没有。”
“在函数声明避免常量通过噪声值参数。仍然使在同一个函数的定义的参数常量如果它不会被修改。”
在第二段说,不要把常量的声明。我想这是因为一个数值参数的常量性是没有意义的接口定义的一部分。这是一个实现细节。
在此基础上建议,则它也建议的指针参数的指针值? (这是在参考参数,因为你不能重新分配的参考意义。)
// header
int func1(int* i);
int func2(int* i);
// cpp
int func1(int* i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compiles without error
return *i;
}
int func2(int* const i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compile error
return *i;
}
<强>要点:强>制作值参数是捕捉一些逻辑错误。它是一个最好的做法?你去离开常量出来的头文件中的极端?难道仅仅是有用的常量指针值?为什么或者为什么不呢?
<强>的一些参考文献:强>
C ++关键字const - ?使用宽松 为函数参数 '常量' 的使用
当常数值参数是有用的一个示例:
bool are_ints_equal(const int i, const int j) {
if (i = j) { // without the consts this would compile without error
return true;
} else {
return false;
}
// return i = j; // I know it can be shortened
}
解决方案
我取它:
这不是一个坏主意,但问题是次要的,你的能量可能会在其他的事情可能会更好一些。
在你的问题,你所提供的,当它可能赶上一个错误一个很好的例子,但偶尔也最终会做这样的事情:
void foo(const int count ...)
{
int temp = count; // can't modify count, so we need a copy of it
++temp;
/* ... */
}
利弊是轻微的任何一种方式。
其他提示
我读过很多次,在函数常量创造价值的参数是一个坏事情,因为这是不必要的。
不过,我觉得偶尔对我很有帮助,作为检查,我的实现并不(你的问题的结束作为例子)做一些事情,我不打算。
所以,虽然它可能不增加价值的调用者,但它有时增加的值小一点,以我作为一个执行者,并且不采取任何从主叫路程。所以,我用它看不出有任何的伤害。
例如,我可以实现C函数需要几个指针到缓冲器 - 一个指针开始,一个指针到最后。我打算把缓冲区中的数据,但希望确保我不超限结束。所以,在函数内部有代码,我添加数据,这将增加一个指针。使得指向缓冲区的指针的端部的const
参数将确保我不符号UP不小心递增端边界指针来代替指针I真的应该递增的一个错误。
因此,一个fillArray函数这样的签名:
size_t fillArray( data_t* pStart, data_t* const pEnd);
会阻止我意外增加pEnd
当我真正的意思是递增pStart
。这不是一个巨大的东西,但我敢肯定,大家谁也设定在C的任何一段时间已经过这样的错误运行。
不幸的是,一些编译器(我看着你,太阳CC!)声明不正确的参数常量和那些没有宣布这样区分,你可以得到有关未定义功能的错误。
我想这取决于你的个人风格。
它不会增加或减少哪些客户端可以传递给你的函数。它在本质上就像一个编译时断言。如果它可以帮助你知道值不会改变,继续做,但我没有看到一个很大的原因为他人做了。
一个原因,我可能不会做它该值参数的常量性是一个实现细节,你的客户端不需要了解。如果以后(故意)更改功能,因此,它实际上没有改变这个值,你就需要改变你的函数的签名,这将迫使客户重新编译。
这是相似的,为什么有些人建议有没有公共虚拟方法(功能虚拟岬是一个实现细节应该从客户端被隐藏),但我不是在特定的阵营。
如果有const关键字存在;它意味着的“i”的值(这是const型)不能被修改。 如果“i”的值被foo的函数的编译器内改变将引发错误:“
无法修改const对象
但是改变“* I”(即* I = 3)是指你不改变由指出的地址的“i”的值,但其值的“i”
实际上,const函数适合于不应该由函数所改变大对象。
我们都解开别人的C ++代码,不时。和别人的C ++代码是通过定义一个完整的混乱:d
所以,第一件事,我总是做破译它(本地及全球的数据流),直到编译器抱怨放在const
在每一个变量定义。这也意味着常量,限定值参数,它确实有助于避免已经在功能上中间被修改变量,而我注意到它...
所以,我真的很感激,当别人有常量到处(包括值参数):d
我喜欢这样的情况const正确性:结果
void foo(const Bar &b) //I know b cannot be changed
{
//do something with b
}
这让我用b
而不必担心修改它,但我没有付出拷贝构造函数的成本。