gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:29:12 25 4
gpt4 key购买 nike

假设我有一些代码如下所示,它创建了两个 vector 并希望将它们传递给一个函数并保证该函数不会更改列表中的数据。我用 **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 或非常量 vector 变量传递给此函数。但是,变量名称 lst 指的是一个 const 变量,因此除非在变量上使用 const_cast,否则将无法改变 vector 中的数据成员。

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

  • Const in for range based loop:这会强制函数只接受非常量参数,但会确保范围循环不会改变引用。

最佳答案

  • Const in parameter list: This would allow either a const or non-const vector variable to be passed to this function. However, the variable name lst is referring to an const variable and as such will not be able to alter the data members apart of the vector unless const_cast is used on the variable.

“这将允许 const 或非 const ...” 后者不适用,只要您要在该函数内更改它即可。

  • Const after the function declaration: This would require that it was a member function, but would not allow any members to be altered.

您实际上没有成员函数。

  • Const in for range based loop: This would force the function to only accept a non-const parameter, but would ensure that the range loop did not alter the reference.

“...但会确保范围循环不会改变引用”

当然。


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

lst.push_back(1);

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

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

对于免费功能来说毫无意义。 const 后缀用于可与类的 const(右值)实例一起使用的类成员函数。


好吧,上面解释了您的代码的技术错误。关于使用 const 的优缺点,我唯一能说的是:

  • 从一开始就正确使用它。
  • 使用它来表达代码的预期语义。

这些都是有利的,可以使您的代码更加健壮,以防止无效尝试使用它。

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

关于c++ - 在函数声明中使用 Const 的优点/缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com