Na programação orientada a objetos, "passagem por cópia" e "passagem por referência" referem-se a diferentes formas de passar argumentos para funções ou métodos. No entanto, a terminologia varia dependendo do idioma e do contexto.
Passar por cópia: -
Argumentos passados como cópias: Na passagem por cópia, uma cópia do argumento real é criada e passada para a função. Qualquer modificação feita nesta cópia dentro da função não afeta a variável original fora da função.
-
Tipos de valor: A passagem por cópia é comumente usada com tipos de valor, que são tipos de dados que contêm seu valor diretamente. Por exemplo, em C++ ou Java, int, double, boolean, etc. são tipos de valor.
Passar por referência: -
Argumentos como referências: Na passagem por referência, uma referência ao argumento real é passada para a função. Quaisquer alterações feitas no argumento dentro da função são refletidas diretamente na variável original fora da função.
-
Tipos de referência: A passagem por referência é frequentemente usada com tipos de referência, que são tipos de dados que contêm uma referência a um local de memória onde os dados reais são armazenados. Por exemplo, em C++ e Java, objetos (instâncias de classes) são tipos de referência.
Em algumas linguagens, o comportamento pode ser controlado explicitamente usando palavras-chave como "passagem por referência" ou "&" (para parâmetros de referência) e "passagem por valor" ou "*" (para parâmetros de valor).
Por exemplo, em C++:
```cpp
void increment(int value) { // passa por valor
valor++; //modifica a cópia
}
void incrementRef(int &value) { // passa por referência
valor++; //modifica a variável original
}
int principal() {
interno x =5; //tipo de valor
incremento(x); // x permanece 5
incrementRef(x); // x se torna 6
}
```
Em Java:
```java
public void increment(int value) { // passa por valor
valor++; //modifica a cópia
}
public void incrementRef(int &value) { // passa por referência
valor++; //modifica a variável original
}
public static void main(String[] args) {
interno x =5; // tipo de valor primitivo
incremento(x); // x permanece 5
incrementRef(x); // x se torna 6
}
```
Em Python, os argumentos são sempre passados por referência. No entanto, Python usa um mecanismo de contagem de referências para gerenciar o tempo de vida do objeto, e você pode criar cópias independentes da contagem de referências do objeto original.
Compreender a passagem por cópia e a passagem por referência ajuda a gerenciar a memória de forma eficiente, evitando modificações indesejadas e garantindo o comportamento adequado de funções/métodos que operam em argumentos.