Программирование >>  Инициализация объектов класса, структура 

1 ... 210 211 212 [ 213 ] 214 215 216 ... 395


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 при



1 ... 210 211 212 [ 213 ] 214 215 216 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика