在此代码中使用const

时间:2014-09-09 16:11:26

标签: c++ const

这段代码在不使用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  }

5 个答案:

答案 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};