Я считаю, что иметь одинаковые имена членов в этом случае - плохая идея, потому что это делает код более подверженным ошибкам.
Представьте себе сценарий: у вас есть пара декартовых точек: pntA и pntB. Затем вы решаете, по какой-то причине, что они должны быть лучше представлены в полярных координатах, и меняете объявление и конструктор.
Теперь, если все ваши операции были просто вызовами методов, такими как:
double distance = pntA.distanceFrom(pntB);
тогда ты в порядке. Но что, если вы использовали членов явно? сравнить
double leftMargin = abs(pntA.x - pntB.x);
double leftMargin = abs(pntA.first - pntB.first);
В первом случае код не будет компилироваться. Вы сразу увидите ошибку и сможете ее исправить. Но если у вас одинаковые имена членов, ошибка будет только на логическом уровне, гораздо сложнее обнаружить.
Если вы пишете необъектно-ориентированным языком, тогда еще проще передать неправильную структуру в функцию. Что мешает вам написать следующий код?
double distance = calculate_distance_polar(cartesianPointA, polarPointB);
С другой стороны, различные типы данных позволят вам найти ошибку во время компиляции.