Const通过值传递的函数参数的正确性

时间:2012-05-30 14:23:47

标签: c++ c arguments const

  

可能重复:
  Const correctness for value parameters

我认为以下是一个很好的编码实践。当一个参数按值传递给一个函数时,它只能被读取,但不能在函数体中修改(或重用)。但这实际上是一种好习惯吗?

示例(我避免做的事):

int foo(int x){
    //do lots of cool stuff
    x = 69;
    //do even cooler stuff
}

从这里开始,我们得到const正确性。如果我的实践很好,那么几乎每个函数的每个参数都应该以“const”开头。实际上“a”是乐观的:

class A{
    const int gnoo(const int *const, const double) const;
};

2 个答案:

答案 0 :(得分:1)

问题有两个方面,声明定义。在声明点,函数参数的顶级限定符被删除,因此编译器将删除const。另一方面,在定义,编译器确保如果参数为const,则不会在内部修改它。

返回类型是另一个故事,其中const未从声明中删除,但在这种情况下,您很可能不想制作返回的对象(如果它是值const,因为这可能会以几种不同的方式限制优化编译器的机会。第一个,C ++ 11中的全新版本是你不能移动一个const对象,这意味着通过返回一个const对象来禁止从中移动。在C ++ 03中,这种影响的情况更少,更多的是一个极端情况,但返回const个对象的优势有限。

有些人建议到处添加const。我没有,而且我读过的大多数代码都没有。

答案 1 :(得分:0)

你的观点很好。根据语言的不同,编译器/解释器在看到代码时可​​能会抛出错误或警告。

然而,在某些时候你必须选择是否要尝试保护“开发人员”不要做一些愚蠢的事情,或者只是假设他们是这样并且在代码审查期间捕获这类事情。

利用语法机制使代码更安全是一件好事,恕我直言。不幸的是,它可能会阻碍开发流程。