在函数声明中使用Const的优点/缺点

时间:2016-04-08 18:56:49

标签: c++ const

假设我说下面有一些代码创建了两个向量,并希望将它们传递给函数,并保证函数不会改变列表中的数据。我标有**const**的可能位置。如果我错过任何请告诉我。基本上我想知道我的想法是否正确,无论是利弊还是我应该使用其中一种的情况。

#include <iostream>
#include <vector>

using namespace std;

int makeSum(/**/ const /**/ vector<int>& lst) /**/ const /**/
{
    int total {};

    lst.push_back(1);

    for (/**/ const /**/ auto& value : lst) {
        total += value;
    }

    return total;
}

int main(int argc, char* argv[])
{
    vector<int> test1 = {1, 2, 3, 4, 5};
    vector<int> test2 = {2, 3, 5, 6};

    cout << makeSum(test1) << endl; //15
    cout << makeSum(test2) << endl; //16

    return 0;
}
  • 参数列表中的Const:这将允许将const或非const向量变量传递给此函数。但是,变量名称lst指的是const变量,因此除非在变量上使用const_cast,否则将无法更改向量的数据成员。

  • 函数声明后的Const:这将要求它是一个成员函数,但不允许任何成员被更改。

  • 基于范围的循环的Const in:这会强制函数只接受非const参数,但会确保范围循环不会改变引用。

1 个答案:

答案 0 :(得分:1)

  
      
  • 参数列表中的Const:这将允许将const或非const向量变量传递给此函数。但是,变量名lst指的是const变量,因此除非在变量上使用const_cast,否则将无法改变向量的数据成员。
  •   

&#34;这将允许const或非const ...&#34; Nope,只要您在该函数内部进行更改即可。

  
      
  • 函数声明后的Const:这将要求它是一个成员函数,但不允许任何成员被更改。
  •   

您实际上没有会员功能。

  
      
  • 基于范围的循环的Const in:这会强制函数只接受非const参数,但会确保范围循环不会改变引用。
  •   

&#34; ...但会确保范围循环不会改变参考&#34;

当然。

Your code doesn't compile有几个原因:

lst.push_back(1);

是应用于const引用参数的非const操作。

int makeSum(/**/ const /**/ vector<int>& lst) /**/ const /**/
                                                // ^^^^^

对于免费功能没有任何意义。 const后缀用于可以与类的const(rvalue)实例一起使用的类成员函数。

以上解释了代码的技术错误。关于使用const的优缺点,我唯一可以说的是:

  • 从头开始正确使用它。
  • 用它来表示代码的预期语义。

这些都是专业人士,使您的代码更强大,以防止无效尝试使用它。

如果您需要重构更大的现有代码库以正确获取const声明,则可能会出现这种情况。这可能是一个严肃的PITA,如果这是值得的,应该重新考虑(特别是对于已经工作的代码)。