假设我说下面有一些代码创建了两个向量,并希望将它们传递给函数,并保证函数不会改变列表中的数据。我标有**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参数,但会确保范围循环不会改变引用。
答案 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,如果这是值得的,应该重新考虑(特别是对于已经工作的代码)。