我应该声明一个永远不会被改变为const变量的参数吗?

时间:2012-02-09 15:07:59

标签: c++

  

可能重复:
  Use of 'const' for function parameters

例如,

void Func(int para);

如果我知道我不想在Func(...)中更改para的值,我是否应该将para声明为“const int”来保证?即。

void Func(const int para);

BTW,我想

void Func(const int &para);

有时候不是一个合适的选择,因为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”这个词。将由编译器默默地删除...

5 个答案:

答案 0 :(得分:4)

如果你这样做(有些人这样做),那么你应该把const放在定义中(它有用),而不是声明(它是噪声,它不会影响调用者)。 / p>

所以:

void F(int param);

...


void F(int const param) {
   ...
}

答案 1 :(得分:3)

将参数声明为const有三个目的:

  1. 它告诉编译器该值是常量,这可能会启用某些优化。鉴于今天的“智能”编译器,我不确定它是否仍然相关。

  2. 它告诉程序员一眼就看出函数中的值没有变化,这可能会有助于调试/增强代码。

  3. 它使编译器实际强制执行您的断言,即函数不会更改该值。

  4. 一般来说,如果可以的话,将变量声明为const是一个好主意,出于同样的原因,最好不要使用编译器警告:它会使代码更容易支持。

答案 2 :(得分:0)

const int para:对你有用,因为它会阻止你错误地修改para。不确定混淆问题。

const int &para:你应该这样做,事实上有时候如果其他地方的代码坚持让para保持不变(例如,如果你正在为map编写自定义比较函数,你必须这样做)。它也比const int para更有效 - 如果您不修改para,为什么需要复制它?

我认为const int &para在底层实施的内容并不重要。重要的是,最重要的是你不能修改它(没有邪恶)所以效果与const int para相同,但效率更高。

答案 3 :(得分:0)

我认为它只会为头文件的读者澄清一些事情,通过标记参数const它实际上只是说它是输入。同样,&引用运算符被读作函数中正在修改的参数,对传递的参数有效。这可能是出现混淆的地方,但const int &paraconst引用之前是&“并且不需要太多解释。

我混淆了&*符号,因为我已经习惯了&运算符不存在的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。