Um dos maiores benefícios das referências sobre os ponteiros é maior simplicidade e legibilidade. Como sempre, quando você simplifica algo, você o torna mais fácil de usar, mas ao custo da flexibilidade e do controle que obtém com o material de baixo nível (como outras pessoas mencionaram).
Os ponteiros são frequentemente criticados por serem “feios”.
class* myClass = new class();
Agora, toda vez que você usá-lo, você deve desreferenciá-lo primeiro por
myClass->Method() or (*myClass).Method()
Apesar de perder alguma legibilidade e adicionar complexidade, as pessoas ainda precisavam usar ponteiros frequentemente como parâmetros para que você pudesse modificar o objeto real (em vez de passar por valor) e para o ganho de desempenho por não ter que copiar objetos grandes.
Para mim, é por isso que as referências 'nasceram' em primeiro lugar para fornecer o mesmo benefício que os ponteiros, mas sem toda aquela sintaxe de ponteiro. Agora você pode passar o objeto real (não apenas seu valor) E você tem uma maneira normal e mais legível de interagir com o objeto.
MyMethod(&type parameter)
{
parameter.DoThis()
parameter.DoThat()
}
As referências C ++ diferem das referências C # / Java porque, uma vez que você atribui um valor a ele, não é possível reatribuí-lo (e ele deve ser atribuído quando foi declarado). Isso era o mesmo que usar um ponteiro const (um ponteiro que não pode ser re-apontado para outro objeto).
Java e C # são linguagens modernas de nível muito alto que limparam muitas das bagunças que se acumularam em C / C ++ ao longo dos anos e os ponteiros eram definitivamente uma daquelas coisas que precisavam ser 'limpas'.
No que diz respeito ao seu comentário sobre saber ponteiros o torna um programador mais forte, isso é verdade na maioria dos casos. Se você sabe 'como' algo funciona, ao invés de apenas usá-lo sem saber, eu diria que isso pode lhe dar uma vantagem. O quanto de uma borda sempre variará. Afinal, usar algo sem saber como é implementado é uma das muitas belezas de OOP e Interfaces.
Neste exemplo específico, o que saber sobre ponteiros o ajudaria com referências? Entender que uma referência C # NÃO é o próprio objeto, mas aponta para o objeto, é um conceito muito importante.
# 1: Você NÃO está passando por valor
Bem, para começar, quando você usa um ponteiro, você sabe que o ponteiro contém apenas um endereço, é isso. A variável em si está quase vazia e é por isso que é tão bom passar como argumentos. Além do ganho de desempenho, você está trabalhando com o objeto real, portanto, quaisquer alterações feitas não são temporárias
# 2: Polimorfismo / Interfaces
Quando você tem uma referência que é um tipo de interface e aponta para um objeto, você só pode chamar métodos dessa interface, embora o objeto possa ter muito mais habilidades. Os objetos também podem implementar os mesmos métodos de maneira diferente.
Se você entende bem esses conceitos, não acho que esteja perdendo muito por não ter usado ponteiros. C ++ é frequentemente usado como uma linguagem para aprender programação porque às vezes é bom sujar as mãos. Além disso, trabalhar com aspectos de nível inferior faz com que você aprecie os confortos de uma linguagem moderna. Comecei com C ++ e agora sou um programador C # e sinto que trabalhar com ponteiros brutos me ajudou a ter um melhor entendimento do que está acontecendo nos bastidores.
Não acho que seja necessário que todos comecem com ponteiros, mas o importante é que eles entendam por que referências são usadas em vez de tipos de valor e a melhor maneira de entender isso é olhar para seu ancestral, o ponteiro.