Пункт 1: У вас нет двух x
с. Параметр x
. Полное имя пользователя x
: abc::x
.
Пункт 2: Компилятор умный.
Когда он единственный Джон вокруг, вы можете позвонить Джону Смиту Джону, и окружающие обычно могут выяснить, к кому вы обращаетесь. В комнате, полной Джонса, вам может понадобиться использовать его полное имя. В случае нескольких Джонов Смитов, вам может потребоваться сделать еще один шаг и использовать Джона Пола Смита.
В большой комнате вам может не понравиться позвонить Джону Полу Смиту Джону, если другие Джонс будут дальше. Все рядом будут считать, что вы имеете в виду ближайшего Джона. Если они не правы, вы, коммуникатор, должны быть более явными.
Компилятор делает то же самое. Поведение по умолчанию - использовать ближайший x
, тот, который имеет наименьшую видимую область видимости. Это будет параметр x
. Если вы хотите использовать x
, который находится дальше, вы используете однозначное имя.
Примечания:
Хотя этот случай легко избежать и является легким источником ошибок, что делает его плохим решением, вы обнаружите, что время от времени вам необходимо более полно квалифицировать идентификаторы дляпример, когда вы хотите вызвать функцию-член базового класса из производного класса после того, как производный класс переопределил функцию.
Связано, это одна из причин, по которой using namespace std;
это , как правило, плохоидея .