【问题标题】:using const in this code [duplicate]在此代码中使用 const [重复]
【发布时间】:2014-11-03 03:45:43
【问题描述】:

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

【问题讨论】:

  • 更好的问题:“这段代码用 const 编译和执行得很好,这里不使用 const 有什么特殊原因吗?”。
  • @JonathanDursi:不是重复的,因为没有const T xx[]形式的参数,只有const T询问。
  • @Deduplicator :我看到了这个论点,但是对这个问题的回答特别提出了指针、引用等问题。这个问题没有理由独立存在,尽管肯定有是一个更好的 dup 建议。

标签: c++ constants


【解决方案1】:

您使用const 来实现const-正确性。这意味着您已经告诉编译器(以及您的代码的任何读者)所有不会改变它们自身或它们所处理的对象的东西。您已经sum 的 args 完成了此操作,正确地说它们在函数中没有更改。您之所以费心这样做是因为它掩盖了代码更容易推理(对于读者)并打开了优化的可能性(对于编译器)。

【讨论】:

  • 并允许传递const int 的数组。 (函数参数的顶级限定符不是函数声明的一部分,而只是定义,请参阅length。在这种情况下,可以在分配给参数时添加限定符)
【解决方案2】:

第一个const 承诺永远不会更改数组。对于您发布的代码,它没有任何区别。但是想象一下 arr 已在 main 中声明为 int const arr[] 。编写的函数仍然可以工作,但如果没有 const 它不会,尽管从未更改数组。

length 之前的const 但是不会改变函数的接口。它只会导致局部参数变量length 不可更改。如果您确实不想在实现中更改length,这可以作为一种保障(因为编译器会将length 的任何更改标记为错误)。

【讨论】:

    【解决方案3】:

    第一个 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;
    }
    

    现在,如果您尝试在没有第一个 const 的情况下编译 sum(),您将收到编译器错误,因为您无法将 arr 转换为非常量数组(本质上是指针)。

    尽管 7 是一个常量,您仍然可以删除函数 sum 中的第二个 const,因为它是按值传递的。

    【讨论】:

      【解决方案4】:

      函数声明中有两个限定符 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};
      

      【讨论】:

        【解决方案5】:
        int sum(const int array[], const int length) {/* ... */}
        

        虽然第一个 const 不是顶级的(array 是指向 const int 的非限定指针类型),但第二个是。

        因此,第二个与函数定义有关,它根本不会改变函数声明,因此应该将其排除在纯声明之外外来噪音。

        等效的声明

        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-qualifying length 的原因与任何局部变量完全相同:通过直接更改或无意中将其传递给修改函数来避免无意更改。
        • const-限定指针array 的元素类型的原因(用于说明它是一个数组的数组表示法)是为了向调用者保证元素不会被更改。这允许将指针传递给const-qualified 和 unqualified ints。

        【讨论】:

          猜你喜欢
          • 2017-08-26
          • 2012-08-24
          • 1970-01-01
          • 1970-01-01
          • 2020-07-02
          • 1970-01-01
          • 2021-10-05
          • 1970-01-01
          • 2023-01-27
          相关资源
          最近更新 更多