|
Программирование >> Инициализация объектов класса, структура
int height; class Screen { public: Screen( int height ) { height = 0; к чему относится height? К параметру private: short height; Имена, встречающиеся в теле встроенной функции-члена, разрешаются так: }; В поисках объявления имени height, которое встретилось в определении конструктора Screen, компилятор просматривает локальную область видимости функции и находит его там. Следовательно, это имя относится к объявлению параметра. Если бы такое объявление не было найдено, компилятор начал бы поиск в области видимости класса Screen, просматривая все объявления его членов, пока не встретится объявление члена height. Говорят, что имя члена height скрыто объявлением параметра конструктора, но его можно использовать в теле конструктора, если int height; class Screen { public: Screen( long height ) { this-> height = 0; относится к Screen:: height тоже правильно: Screen:: height = 0; private: short height; квалифицировать имя члена именем его класса или явно использовать указатель this: Если бы не были найдены ни объявление параметра, ни объявление члена, компилятор стал бы искать их в объемлющих областях видимости пространств имен. В нашем примере в глобальной области видимости просматриваются объявления, которые расположены перед определением класса Screen. В результате было бы найдено объявление глобального объекта height. Говорят, что такой объект скрыт за Имя, встретившееся в определении функции-члена класса, разрешается следующим образом: 1. Сначала просматриваются объявления в локальных областях видимости функции-члена. (О локальных областях видимости и локальных объявлениях говорилось в разделе 8.1.) 2. Если шаг 1 не привел к успеху, то просматриваются объявления для всех членов класса. 3. Если и этого оказалось недостаточно, просматриваются объявления в пространстве имен перед определением функции-члена. class Screen { public: ... void setHeight( int ); private: short height; int verify(int); void Screen::setHeight( int var ) { var: относится к параметру height: относится к члену класса verify: относится к глобальной функции height = verify( var ); члена: Обратите внимание, что объявление глобальной функции verify() невидимо до определения класса Screen. Однако на третьем шаге разрешения имени просматриваются объявления в областях видимости пространств имен, видимые перед определением члена, поэтому нужное объявление обнаруживается. Имя, встретившееся в определении статического члена класса, разрешается следующим образом: 1. Просматриваются объявления всех членов класса. 2. Если шаг 1 не привел к успеху, то просматриваются объявления, расположенные в областях видимости пространств имен перед определением статического члена, а не только предшествующие определению класса. Упражнение 13.18 Назовите те части программы, которые находятся в области видимости класса. объявлением члена класса, однако его можно использовать в теле конструктора, если int height; class Screen { public: Screen( long height ) { :: height = 0; относится к глобальному объекту private: short height; квалифицировать оператором разрешения глобальной области видимости: Если конструктор объявлен вне определения класса, то на третьем шаге разрешения имени просматриваются объявления в глобальной области видимости, которые встретились перед определением класса Screen, а также перед определением функции- typedef int Type; Type initVal(); class Exercise { public: ... typedef double Type; Type setVal( Type ); Type initVal(); private: int val; Type Exercise::setVal( Type parm ) { val = parm + initVal(); употреблении в определении функции-члена setVal() ? Определение функции-члена setVal () ошибочно. Можете ли вы сказать, почему? Внесите необходимые изменения, чтобы в классе Exercise использовался глобальный typedef Type и глобальная функция initVal() . 13.10. Вложенные классы A Класс, объявленный внутри другого класса, называется вложенным. Он является членом объемлющего класса, а его определение может находиться в любой из секций public, private или protected объемлющего класса. Имя вложенного класса известно в области видимости объемлющего класса, но ни в каких других областях. Это означает, что оно не конфликтует с таким же именем, объявленным в объемлющей области видимости. Например: Упражнение 13.19 Назовите те части программы, которые находятся в области видимости класса и для которых при разрешении имен просматривается полная область (т.е. принимаются во внимание все члены, объявленные в теле класса). Упражнение 13.20 К каким объявлениям относится имя Type при использовании в теле класса Exersise и в определении его функции-члена setVal () ? (Напоминаем, что разные вхождения могут относиться к разным объявлениям.) К каким объявлениям относится имя initVal при
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |