你走多远const?您是否只是const在必要时制作功能,或者您是否全力以赴并在任何地方使用它?例如,想象一个简单的mutator,它接受一个布尔参数:
void SetValue(const bool b) { my_val_ = b; }
Run Code Online (Sandbox Code Playgroud)
这const实际上有用吗?我个人选择广泛使用它,包括参数,但在这种情况下,我想知道它是否值得?
我还惊讶地发现你可以省略const函数声明中的参数,但可以将它包含在函数定义中,例如:
.h文件
void func(int n, long l);
Run Code Online (Sandbox Code Playgroud)
.cpp文件
void func(const int n, const long l)
Run Code Online (Sandbox Code Playgroud)
是否有一个原因?这对我来说似乎有点不寻常.
我喜欢const在可能的情况下声明偶数值参数,通过搜索SO,我发现这并不常见.像这样:
int add(const int a, const int b)
{
...
}
Run Code Online (Sandbox Code Playgroud)
但我想知道:const因为值是我的函数的实现细节,而不是它的接口的一部分.因此将它放入原型似乎是不必要的.
这个上述函数的原型似乎工作得很好:
int add(int a, int b);
Run Code Online (Sandbox Code Playgroud)
然而,我听说过一些问题,例如将main函数的argc声明为const会导致问题:
int main(const int argc, const char* const argv[])
Run Code Online (Sandbox Code Playgroud)
这是否意味着,int add(int a, int b)和int add(const int a, const int b)终究不是相同?
如果它在技术上还可以,我应该做些什么?我也可以在原型中省略变量名,但我没有,所以也许我也不应该遗漏const?
是否const为标准允许的函数参数添加其他说明符,如下所示?
foo.h:
int foo(int x, char * data);
Run Code Online (Sandbox Code Playgroud)
foo.c:
// does this match the prototype?
int foo(const int x, char * const data) {
// this implementation promises not to change x or move data inside the function
}
Run Code Online (Sandbox Code Playgroud)
GCC接受它-std=c99 -Wpedantic -Wall -Werror,但不一定与标准兼容.
这个答案表明C++标准允许这样做 - C(99)标准是否允许这样做?
我有以下C++代码,其中声明中我的构造函数的参数具有与构造函数的定义不同的常量.
//testClass.hpp
class testClass {
public:
testClass(const int *x);
};
//testClass.cpp
testClass::testClass(const int * const x) {}
Run Code Online (Sandbox Code Playgroud)
我能够使用g ++编译这个没有警告,如果这个代码编译或至少给出一些警告?事实证明,64位solaris上的内置C++编译器给了我一个链接器错误,这就是我注意到存在问题的方式.
在这种情况下匹配参数的规则是什么?这取决于编译器吗?