【问题标题】:Why use const int parameter when overloading the subscript operator?为什么在重载下标运算符时使用 const int 参数?
【发布时间】:2014-01-10 10:51:45
【问题描述】:

我是 C++ 新手,请您解释一下为什么/何时应该使用它

int & MyArray::operator[] (const int i)
{
    return arr[i];
}

而不是这个

int & MyArray::operator[] (int i)
{
    return arr[i];
}

【问题讨论】:

  • 这只是一个好习惯。如果您不打算修改参数的值,那么您不妨将其设为 const。
  • @AliAlamiri 只要你不在函数声明中这样做,因为那会误导。
  • @juanchopanza:为什么会误导你?通过您的回答,您显然知道这意味着什么。
  • @AliAlamiri 我的意思是,大多数代码用户查看的是声明,而不是定义。因此,我将定义中的const 视为不应在声明中表达的实现细节。但这只是我个人的喜好。
  • @juanchopanza: 啊,虽然我想我们可以声明int &foo(int idx); 并定义int &foo(int idx) [[const int idx]] {,或者一些这样的特殊语法来重新定义定义中的参数。这将避免混淆任何人(那些不希望在声明中看到不相关的const 的人以及那些希望声明与定义匹配的人),代价是太丑了,没人会使用它。然后可以根据需要将const 作为函数签名的一部分,因为我们有办法在不更改接口的情况下更改实现细节。

标签: c++ operator-overloading constants


【解决方案1】:

这并没有太大的区别!

有些人喜欢将参数视为不可变的,因此他们将其标记为const。在这种情况下,这是一个风格问题。

【讨论】:

  • 这绝对不是文体问题,因为如果你尝试修改函数体内的const 参数会报错。
  • @mfukar - 我的意思是它的风格,因为它不会改变重载分辨率,更多的是关于你如何处理参数。
  • 在这种情况下,这是我的 +1,先生。 :)
  • 它为编译器提供了进一步优化的空间。所以说它没有太大的区别需要有资格。你也可以说 id 确实有很大的不同。这真的取决于上下文。
【解决方案2】:

在函数声明中,它完全没有区别,因为顶级consts 被忽略了。

这两个实际上是同一个声明,因此应该避免函数参数中的顶级const

void foo(int);
void foo(const int); // re-declaration of above function

在函数定义中,这意味着你不能更改函数中参数的副本:

void foo(int i) { i++; } // OK
void foo(const int i) { i++; } // Error

所以,它可以作为一个实现工件,来表示局部变量是const。这为编译器提供了更多执行优化的空间。

【讨论】:

  • "这可能允许编译器执行一些优化。" - 举一个具体的例子:如果函数将一个指向i 的指针传递给未知代码,那么使用const,优化器可以依赖于不改变的值,这意味着它不需要从任何寄存器中清除它它可能存储在其中,并且如果对 foo 的调用内联了在编译时已知的 i 值,则在调用未知代码之后使用 i 的值可以使用编译时价值。如果没有const,它就无法做到这一点。
【解决方案3】:

不要这样做。从调用者的角度来看是相同的,只是增加了视觉噪音。

参数i是按值传递的,是一个普通的数据类型,它是被复制的,所以当你把它标记为const时,你是在告诉编译器它不能在方法内部改变,但是因为它是一个复制它根本不重要,在这个特定的示例中,您只是将它用作索引。

【讨论】:

    【解决方案4】:

    两种形式都是正确的。如果要确保函数中不会修改“i”参数,请使用第一个,如果函数更长/更复杂,这可能很有用。 但是,在操作符的声明中不要使用 const:

    int& operator[](int i);
    

    声明不带 const,定义带 const 是合法的。

    【讨论】:

    • 除非您使用 SunStudio 编译器,否则您绝对应该使您的定义与您的声明相匹配。
    【解决方案5】:

    作为一般规则,您不打算修改的任何内容都应该是const

    【讨论】:

      【解决方案6】:

      如果您不尝试编辑参数,则最好使用const

      就性能而言,差别不大。但它可以防止您的参数在函数内部被编辑(意外)。

      int & MyArray::operator[] (const int i)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 2014-07-28
        • 2014-04-22
        • 1970-01-01
        相关资源
        最近更新 更多