С++ для начинающих




Разрешение имен в области видимости класса - часть 2


Имена, встречающиеся в теле встроенной функции-члена, разрешаются так:

int _height;

class Screen {

public:

   Screen( int _height ) {

      _height = 0;   // к чему относится _height? К параметру

   }

private:

   short _height;

};

В поисках объявления имени _height, которое встретилось в определении конструктора Screen, компилятор просматривает локальную область видимости функции и находит его там. Следовательно, это имя относится к объявлению параметра.

Если бы такое объявление не было найдено, компилятор начал бы поиск в области видимости класса Screen, просматривая все объявления его членов, пока не встретится объявление члена _height. Говорят, что имя члена _height скрыто объявлением параметра конструктора, но его можно использовать в теле конструктора, если квалифицировать имя члена именем его класса или явно использовать указатель this:

int _height;

class Screen {

public:

   Screen( long _height ) {

      this->_height = 0;   // относится к Screen::_height

      // тоже правильно:

      // Screen::_height = 0;

   }

private:

   short _height;

};

Если бы не были найдены ни объявление параметра, ни объявление члена, компилятор стал бы искать их в объемлющих областях видимости пространств имен. В нашем примере в глобальной области видимости просматриваются объявления, которые расположены перед определением класса Screen. В результате было бы найдено объявление глобального объекта _height. Говорят, что такой объект скрыт за объявлением члена класса, однако его можно использовать в теле конструктора, если квалифицировать оператором разрешения глобальной области видимости:

int _height;

class Screen {

public:

   Screen( long _height ) {

      ::_height = 0;   // относится к глобальному объекту

   }

private:

   short _height;

};

Если конструктор объявлен вне определения класса, то на третьем шаге разрешения имени просматриваются объявления в глобальной области видимости, которые встретились перед определением класса Screen, а также перед определением функции-члена:




Содержание  Назад  Вперед