Программирование >>  Дополнительные возможности наследования 

1 ... 175 176 177 [ 178 ] 179 180 181 ... 265


21 22 23 24 2В 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

Int Window;;Pane;;cnt = 0 ;

Window::Pane;;Pane() ; x(0), y(0) { )

Window::Pane;;Pane() { }

void Window;;Pane::size( int x, int у ) {

if( X < Window;;MAXX M x > 0 )

Pane;;X = X ; if( у < Window::MAX Y && у > 0 )

Pane::y = у ;

void Window: :Pane: :niove( mt x, mt у ) {

if( X < Window::MAX X && x > 0 )

Pane::x = x ; if( у < Window::MAX Y && У > 0 )

Pane::y = у ;

void Window::Pane::show( ) {

std::cout x Pane::x ;

std::cout у Pane::y std::endl

int main( ) {

Window:;Pane pane ;

pane.niove( 20, 20 ) ; pane.show( ) ;

return 0

X 20 у 20

Обратите внимание, что класс Pane вложен в пространство имен Window, Поэтому при обращении к объектам класса Рапе их имена дополняются идентификатором Window::.

Статическая переменная-член сп1, объявленная в строке 16 внутри класса Рапе, определяется как обычно. Но при определении функции-члена Рапе: :size() и обращениях к переменным-членам МАХ Х и MAX Y в строках 26-32 используется явное указание пространства имен. Дело в том, что статическая переменная-член определяется внутри класса Рапе, а определения других функций-членов (это же справедливо для функции Рапе: :move()) происходят как за пределами кгшсса, так и вне тела пространства имен. Без явного указания пространства имен компилятор покажет сообщение об ошибке.



Обратите внимание также на то, что внутри определений функций-членов обращение к объявленным переменным-членам класса происходит с явным указанием имени класса: Рапе: :х и Рапе: :у. Зачем это делается? Дело в том, что у вас возникли бы проблемы, если функция Рапе: :iiiove() определялась бы следующим образом:

void Window::Рапе::move( Int х, int у ) {

if( X < Window::MAX X && x > 0 ) X = x ;

if( у < Window: :MAX Y && у > 0 )

У = У : Platform;;fflove( x. у ) :

Ну что, догадались, в чем проблема? Опасность состоит в том, что компилятор в этом выражении никаких ошибок не заметит.

Источник проблемы заключается в аргументах функции. Аргументы х и у скроют закрытые переменные-члены х и у, объявленные в классе Рапе, поэтому вместо присвоения значений аргументов переменным-членам произойдет присвоение этих значений самим себе. Чтобы исправить эту ошибку, необходимо явно указать переменные-члены класса:

Рапе::х = х; Рапе::у = у;

Кмоневов слово using

Ключевое слово ившу может исполыонпться и как оператор, и в качестве спецификатора при объявлении членов пространстпа имен, но синтаксис использования using при этом меняется.

Использование using как onepamnpa

с помощью ключевого слова uBjnq расишряются области видимости всех членов пространства имен. Впоследствии :)То позволяет ссылаться на члены пространства имен, не указывая соответствующее имя пространства. Использование using показано в следующем примере;

namespace Window { int valuol - 20 ; int value? = 40 ;

Window::valu6l = 10 ;

using namespace Window ; value2 = 30 ;

Bee члены пространства имен Window становятся видимыми, начиная от строки using namespace Window; и до конца соответствующего модуля программы. Обратите внимание, что если для обращения к переменной value! в верхней части фрагмента



программы необходимо указывать пространство имен, то в этом нет необходимости при обращении к переменной value2, поскольку оператор using сделал видимыми все члены пространства имен Window.

Оператор using может использовать в любом модуле программы с различной областью видимости. Когда выполнение программы выходит за область видимости данного модуля, автоматически становятся невидимыми все члены пространства имен, открытые в этом модуле. Проанализируйте это на следующем примере:

namespace Window { int valuel = 20 ; int value2 = 40 :

. . . void f()

using namespace Window ; value2 = 30 :

value2 = 20 ; ошибка!

Последняя строка кода функции f() - value2 = 20 - вызовет ошибку во время компиляции, поскольку переменная value2 в этом месте невидима. Видимость этой переменной, заданная оператором using, закончилась сразу за закрывающими фигурными скобками в предыдущей строке программы.

В случае объявления внутри модуля локальных переменных все одноименные переменные пространства имен, открытые в этом модуле, будут скрыты. Это аналогично сокрытию глобальных переменных локальными в случае совпадения их областей видимости. Даже если переменная, объявленная в пространстве имен, будет открыта с помощью using после объявления локальной переменной, последняя все равно будет иметь приоритет. Это наглядно показано в следуюшем примере:

namespace Window { int valuel = 20 ; int value2 = 40 ;

. . , void f() {

int value2 = 10 ;

using namespace Window :

std::cout << value2 << std::endl ;

При выполнения этой функции на экране появится значение 10, а не 40, подтверждая тот факт, что переменная value2 пространства имен Window скрывается переменной value2 функции f(). Если все же требуется использовать переменную пространства имен, явно укажите имя пространства.



1 ... 175 176 177 [ 178 ] 179 180 181 ... 265

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