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



         

Область видимости класса * - часть 2


class String {

public:

   typedef int index_type;

   char &operator[]( index_type elem )

      { return _string[ elem ]; }

private:

   char *_string;

};

На первом этапе просматриваются имена, использованные в объявлении operator[](), чтобы найти имя типа параметра index_type. Поскольку первый шаг выполняется тогда, когда в теле класса встретилось определение функции-члена, то имя index_type должно быть объявлено до определения operator[]().

Обратите внимание, что член _string объявлен в теле класса после определения operator[](). Это правильно, и _string не является в теле operator[]() необъявленным именем. Имена в телах функций-членов просматриваются на втором шаге разрешения имен в определениях встроенных функций-членов. Этот этап выполняется во всей области видимости класса, как если бы тела функций-членов обрабатывались последними, прямо перед закрытием тела класса, когда все его члены уже объявлены.

Аргументы по умолчанию также разрешаются на втором шаге. Например, в объявлении функции-члена clear() используется имя статического члена bkground, который определен позже:

class Screen {

public:

   // bkground относится к статическому члену,

   // объявленному позже в определении класса

   Screen& clear( char = bkground );

private:

   static const char bkground = '#';

};

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

class Screen {

public:

   // ...

   // ошибка: bkground - нестатический член

   Screen& clear( char = bkground );

private:

   const char bkground = '#';

};

то имя аргумента по умолчанию разрешается нестатическим членом bkground, а это считается ошибкой.




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