Программирование >>  Программирование на языке c++ 

1 ... 31 32 33 [ 34 ] 35 36 37 ... 159


говорит о том, что функция 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 в виде аргумента. Функция



1 ... 31 32 33 [ 34 ] 35 36 37 ... 159

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