|
Программирование >> Программирование на языке c++
говорит о том, что функция f(...) принадлежит классу X. Рассмотрим пример: class my class { float f; public: void set f(float f) { my class::f = f; } Здесь функция set f назначает значение локальному компоненту класса f. Это значение передается в функцию set f в виде ее единственного аргумента с тем же именем f. Таким образом, напрашивается выражение f = f;. Сразу возникает вопрос: какому f и какое значение будет присвоено? Использование же полного имени разрешает неоднозначность, поскольку в выражении my class::f = f; my class::f- это локальный компонент f класса my class, а f - аргумент (локальный аргумент) функции set f. Если задать имя name в виде ::пате (использовать только два двоеточия в виде префикса), то name определяется как глобальное имя, т. е. имя, объявленное за пределами классов. Это оказьшается полезным, когда, например, используются типовые имена библиотечных функций в качестве локальных имен компонентов класса, например: class my graph { public: void circle(. . .); Здесь объявлена компонент-функция с именем circle. Если в этой функции или в другой функции класса my graph необходимо вызвать библиотечную функцию circle, то вызов осуществляется следующим образом: ::circle(. . .). Если при тех же условиях опустить префикс :: , то будет вызвана функция circle компонент класса. Рассмотрим пример. #include <iostream.h> void displayO описание глобальной функции displayO { cout \nwhere am l?\t ; } class my class { char* s; public: my class{char* s) { my class::s=s; }; void displayO описание локальной функции displayO { ::display(); вызов глобальной функции displayO cout I am in s; } void main(void) { my class{ a class\n ).displayO; вызов локальной функции displayO Результат: where am I? I am in a class displayO; Результат; where am I? Рассмотрим выражение: my class( a class\n ).display{); Oho является допустимым. Здесь объявляется анонимный объект класса my class (т. е. объект без имени) и для этого объекта вызывается компонент-функция display(). Подобные конструкции будут встречаться в гл. 9 при рассмотрении библиотеки ObjectWindows. Все другие пояснения для программы были даны выше, в этом параграфе, 3.9. Вложенные классы Один класс можно объявить в другом классе. В этом случае внутренний (первый) класс называется вложенным. Рассмотрим пример: class my class { class nested class { public: Здесь класс nested class является вложенным, так как его объявление помещено в класс my class. Класс nested class объяв- лен В секции private класса my class и поэтому он имеет атрибут private. Напомним, что все компоненты класса имеют атрибут private, заданный по умолчанию. Если вложенный класс имеет атрибут private, то все его компоненты (и компоненты-функции, и компоненты-данные) недоступны за пределами класса, в котором вложенный класс объявлен. В нашем примере все компоненты класса nested class могут быть доступны (или нет, в зависимости от их атрибутов) только из компонентов-функций класса my class и из функций, объяв-леных в классе my class со спецификатором friend. Все компоненты nested class недоступны за пределами класса my class. Доступ к компоненту-классу (вложенному классу) из-за пределов внешнего класса осуществляется согласно общим правилам доступа к любым другим компонентам. Рассмотрим пример: { int а; void f(void); }; { float b; void fp(int); }; class external class { class nested class 1 public: class nested class2 void my function(void) { external class ec; nested class1 a; nested class2 b; external class:: nested class1 ncl; external class:: nested class2 nc2; нет ошибки ошибка ошибка ошибка нет ошибки Рассмотрим другой пример: class external class { class nested class1 { int a; void f(void); }; public: class nested class2 { float b; void fp(int); }; nested class1 function(nested class2); Здесь компоненту-функции function передается объект вложенного класса nested class2 в виде аргумента. Функция
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |