为什么在重载下标运算符时使用const int参数?

时间:2014-01-10 10:51:45

标签: c++ operator-overloading const

我是C ++的新手,所以请你解释为什么/我应该何时使用这个

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

而不是

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

6 个答案:

答案 0 :(得分:4)

它并没有产生太大的差异!

有些人喜欢将参数视为不可变参数,因此将它们标记为const。在这种情况下,这是一种风格化的东西。

答案 1 :(得分:4)

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

这两个实际上是相同的声明,因此应该避免函数参数中的顶级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。这为编译器提供了更多的优化范围。

答案 2 :(得分:1)

不要这样做。它从呼叫者的角度来看是相同的,只会增加视觉噪音。

参数i按值传递并且是纯数据类型,它被复制,因此当您将其标记为const时,您告诉编译器它无法在方法内部进行更改,但是因为它是一个副本,所以它根本不重要,在这个具体的例子中,你只是将它用作索引。

答案 3 :(得分:1)

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

int& operator[](int i);

没有const的声明和使用它的定义是合法的。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

就性能而言,差别不大。但它可以保护您的参数免于编辑(意外)内部函数。

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