Pergunta

Eu sou novo para C++, então você pode por favor explicar por que/quando é que devo utilizar esta

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

em vez de este

int & MyArray::operator[] (int i)
{
    return arr[i];
}
Foi útil?

Solução

É não fazer uma enorme diferença!

Algumas pessoas gostam de tratar de parâmetros como imutáveis, para que eles sinalizador-los como const.Neste caso, é uma estilística coisa.

Outras dicas

Em uma função declaração, ele não faz absolutamente nenhuma diferença, porque de nível superior consts são ignorados.

Estes dois são, na verdade, a mesma declaração, e, por essa razão, nível superior const em função de parâmetros que devem ser evitados:

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

Em uma função definição, isso significa que você não pode mudar a cópia do argumento na sua função:

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

Assim, ele pode ser usado como uma implementação de um artefato, para expressar que a variável local é const.Isto dá o compilador mais escopo para realizar otimizações.

Não faça isso.É idêntico a partir do autor da perspectiva e apenas adiciona o visual ruído.

O parâmetro i é passado por valor e é um simples tipo de dados, ele é copiado, por isso, quando você marcar como const você está dizendo ao compilador que ele não pode ser alterado dentro do método, mas uma vez que é uma cópia que não é importante, e neste exemplo específico que você está apenas usando-o como um índice.

Ambas as formas estão corretas.Use o primeiro se pretender garantir que o "eu" parâmetro não será modificado em função, o que pode ser útil se a função é maior/mais complicado.No entanto, na declaração de que o operador não use const:

int& operator[](int i);

É legal ter declaração sem const, e a definição com ele.

Como um general de regra, qualquer coisa que você não pretende modificar deve ser const

Se você não tentando editar o parâmetro, em seguida, sua melhor usar const.

Tanto quanto o desempenho está em causa não é muita diferença.Mas ele protege o seu parâmetro de edição (acidentalmente) dentro de uma função.

int & MyArray::operator[] (const int i)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top