例如,
void Func(int para);
如果我知道我不想在Func(...)中更改para的值,我是否应该将para声明为“const int”来保证?即。
void Func(const int para);
BTW,我想
void Func(const int ¶);
有时候不是一个合适的选择,因为const int&通常由底层指针实现,因此它基本上等同于
void Func(const int *p_para);
“C ++编码标准:101规则”一书第31页说“void Func(const int para);”很糟糕,因为它会“混淆”头文件的读者。我不确定......
经过深思熟虑之后,我认为一个好的解决方案是将其声明为“void Func(int para);”并在实现时使用“void Func(const int para){...}”。我在“void Func(const int para);”中找到“const”这个词。将由编译器默默地删除...
答案 0 :(得分:4)
如果你这样做(有些人这样做),那么你应该把const放在定义中(它有用),而不是声明(它是噪声,它不会影响调用者)。 / p>
所以:
void F(int param);
...
void F(int const param) {
...
}
答案 1 :(得分:3)
将参数声明为const
有三个目的:
它告诉编译器该值是常量,这可能会启用某些优化。鉴于今天的“智能”编译器,我不确定它是否仍然相关。
它告诉程序员一眼就看出函数中的值没有变化,这可能会有助于调试/增强代码。
它使编译器实际强制执行您的断言,即函数不会更改该值。
一般来说,如果可以的话,将变量声明为const
是一个好主意,出于同样的原因,最好不要使用编译器警告:它会使代码更容易支持。
答案 2 :(得分:0)
const int para
:对你有用,因为它会阻止你错误地修改para。不确定混淆问题。
const int ¶
:你应该这样做,事实上有时候如果其他地方的代码坚持让para
保持不变(例如,如果你正在为map
编写自定义比较函数,你必须这样做)。它也比const int para
更有效 - 如果您不修改para
,为什么需要复制它?
我认为const int ¶
在底层实施的内容并不重要。重要的是,最重要的是你不能修改它(没有邪恶)所以效果与const int para
相同,但效率更高。
答案 3 :(得分:0)
我认为它只会为头文件的读者澄清一些事情,通过标记参数const
它实际上只是说它是输入。同样,&
引用运算符被读作函数中正在修改的参数,对传递的参数有效。这可能是出现混淆的地方,但const int ¶
在const
引用之前是&
“并且不需要太多解释。
我混淆了&
和*
符号,因为我已经习惯了&
运算符不存在的C语言。但是对于C ++,我建议你使用它。
答案 4 :(得分:-1)
你不应该。在C中,参数是按值传递的,因此调用者不需要知道你对它传递的int
做了什么。即使您的功能为void func(int)
,您也可以将const int
传递给它。
void func(int a) {
a=5;
}
...
const int b=7;
func(b);
在此代码中,b
仍为7,因为该函数仅更改了局部变量a
。
当然,如果函数获得指针或引用,则它是不同的。如果声明是void func(int &a)
,那么上面的代码是非法的,因为func
改变了b
,这是const,因此,如果你的函数没有改变引用,你想要将const int
传递给它的可能性,你应该将参数声明为const。