Acredito que ter o mesmo nome de membro seja uma má ideia nesse caso, porque torna o código mais suscetível a erros.
Imagine o cenário: você tem alguns pontos cartesianos: pntA e pntB. Então você decide, por algum motivo, que elas devem ser melhor representadas em coordenadas polares e altera a declaração e o construtor.
Agora, se todas as suas operações fossem apenas chamadas de método, como:
double distance = pntA.distanceFrom(pntB);
então você está bem. Mas e se você usasse os membros explicitamente? Comparar
double leftMargin = abs(pntA.x - pntB.x);
double leftMargin = abs(pntA.first - pntB.first);
No primeiro caso, o código não será compilado. Você verá o erro imediatamente e poderá corrigi-lo. Mas se você tiver os mesmos nomes de membro, o erro será apenas no nível lógico, muito mais difícil de detectar.
Se você escreve em uma linguagem não orientada a objetos, é ainda mais fácil passar uma estrutura incorreta para a função. O que impede você de escrever o seguinte código?
double distance = calculate_distance_polar(cartesianPointA, polarPointB);
Diferentes tipos de dados, por outro lado, permitiriam encontrar o erro durante a compilação.