Por que usar const int parâmetro quando a sobrecarga do operador subscrito?
-
21-12-2019 - |
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];
}
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 const
s 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)