Qual a diferença entre 'passagem por valor' e 'passagem por referência'?

A diferença entre a passagem por valor e a passagem por referência está relacionada à forma como os argumentos são tratados ao passar para uma função ou método.

Na passagem por valor, uma cópia do valor é feita e essa cópia é passada para a função. Qualquer alteração feita dentro da função não afetará o valor original fora dela. Isso ocorre porque a função está trabalhando com uma cópia inteiramente nova em um novo endereço de memória. Por exemplo:

int increment(int value) {
    value = value + 1;
    return value;
}

int main() {
    int number = 10;
    int newNumber = increment(number);
    cout << newNumber; // imprime 11
    cout << number;    // imprime 10 - número original não foi alterado
    return 0;
}

Por outro lado, na passagem por referência, o endereço de memória do argumento é passado para a função. Isso significa que a função tem acesso direto à variável original e qualquer alteração feita dentro da função afetará o valor original fora dela. Por exemplo:

void increment(int &value) {
    value = value + 1;
}

int main() {
    int number = 10;
    increment(number);
    cout << number; // imprime 11 - número original foi alterado
    return 0;
}

A passagem por referência pode ser útil quando queremos modificar o valor original da variável dentro de uma função, enquanto a passagem por valor protege o valor original de qualquer alteração indesejada. Cabe ao programador decidir qual método é mais adequado para a situação em questão.