这段代码在不使用const的情况下编译和执行得很好。 在这里使用const有特殊原因吗?
0 #include <iostream>
1 using namespace std;
2
3 int sum(const int array[], const int length) {
4 long sum = 0;
5 for(int i = 0; i < length; sum += array[i++]);
6 return sum;
7 }
8
9 int main() {
10 int arr[] = {1, 2, 3, 4, 5, 6, 7};
11 cout << "Sum: " << sum(arr, 7) << endl;
12 return 0;
13 }
答案 0 :(得分:5)
您使用const
来获得const
- 正确性。这意味着您已经告诉编译器(以及您的代码的任何读者)所有不自身或其工作对象的内容。你已经为sum
的args做了这个,正确地说它们在函数中没有改变。你之所以这么做是因为它让代码更容易理解(对于读者来说),并为编译器开辟了优化的可能性。
答案 1 :(得分:2)
第一个const背后有很多目的,没有真正需要第二个。
它将在没有const的情况下编译但是尝试这个函数:
int inc(const int array[], const int length)
{
for(int i = 0; i < length; ++i)
++array[i];
}
并且您的代码不应该编译。
删除第一个const
,它将会。
这显示了第一个const
的目的。承诺不改变数据。
相反,尝试更改调用函数:
int main()
{
const int arr[] = {1, 2, 3, 4, 5, 6, 7};
cout << "Sum: " << sum(arr, 7) << endl;
return 0;
}
现在,如果您尝试在没有第一个sum()
的情况下编译const
,您将收到编译器错误,因为您无法将arr
转换为非const数组(实际上是指针)。
然而,即使7是常量,你仍然可以删除函数sum
中的第二个const,因为它是按值传递的。
答案 2 :(得分:1)
int sum(const int array[], const int length) {/* ... */}
虽然第一个const
不是顶级(array
是指向const int
的非限定类型的指针),但第二个是。{/ p>
因此,第二个与函数定义相关,它根本不会改变函数声明,因此应该从纯粹的声明中删除外来的噪音。
等效声明 :
int sum(const int* array, int length); // Removed synatactic sugar and useless const
int sum(const int* const array, const int length); // Added top-level const
在第一部分的基础上,两个const
的原因完全不同:
const
- 限定length
的原因与任何局部变量完全相同:通过直接更改或无意中将其传递给修改函数来避免不经意的更改。const
的原因 - 限定指针array
的元素类型(用于阐明它是一个数组的数组符号),保证调用者不会使用这些元素改变了。这允许将指针传递给const
- 合格和不合格的int
。答案 3 :(得分:0)
第一个const
承诺永远不会更改数组。对于您发布的代码,它没有任何区别。但是,假设arr
已在main
中声明为int const arr[]
。写入的函数仍然有效,但没有const
它不会,尽管从未改变过数组。
const
之前的length
不会更改函数的界面。它只会导致局部参数变量length
不可更改。如果您确实不想在实现中更改length
,那么这可以是一种安全措施(因为编译器会将length
的任何更改标记为错误)。
答案 4 :(得分:0)
函数声明中有两个限定符const
int sum(const int array[], const int length);
实际上,第二个const限定符对使用该函数没有任何特殊意义。这两个函数声明
int sum(const int array[], const int length);
int sum(const int array[], int length);
声明相同的一个功能。这个const只在函数体内起作用。
对于第一个const限定符,它允许使用具有此函数的常量数组。例如,考虑使用以下数组定义的代码
const int arr[] = {1, 2, 3, 4, 5, 6, 7};