Локальные классы

Если класс объявляется вне любого блока, то он называется глобальным. В то же времякласс может объявляться внутри функции, называясь при этом внутренним. Область видимости внутреннего класса ограничивается функцией, в которой он определен. Если класс объявляется внутри другого класса, то он является вложенным. Его область видимости – класс, в котором он определен. Внутренние и вложенные классы называют локальными.

Пример описания вложенного класса:

class Student {// пример 72

int id;

class Exam {

int idExam;

char name[80];

public:

Exam (int idExam, char* s) {

Exam::idExam=idExam;//определение видимости

strcpy(name, s); }

};

Exam* first;

public:

void add(int n, char *s) { first = new Exam(n, s);}

};

Внутри локальных классов можно использовать типы, статические и внешние (extern) переменные, внешние функции и элементы перечислений из области, где локальный класс описан. В то же время нельзя использовать автоматические переменные из указанной области. В локальных классах можно определить статические методы. Во вложенных классах можно также использовать статические переменные. Внутренний класс не может иметь статических переменных. Методы локального класса определяются только внутри класса.

Если один класс вложен в другой класс, то это не дает каких-либо особых прав доступа к элементам друг друга. Обращение может выполняться по общим правилам.

class OuterClass{// пример 73

class InnerClass{

static double d; //во вложенном классе можно использовать статические переменные

}; //конец объявления вложенного класса

}; // конец объявления внешнего класса

double OuterClass::InnerClass::d=5.32 /*определение статической переменной */

void extf(){//Внешняя функция

class InnerClass1{

static double d1; /*ошибка: нельзя определить переменную d1 за пределами функции extf(); */

}; //конец объявления внутреннего класса

InnerClass mc;

};

int main(){

OuterClass oc;

extf();

}

Если только вложенный класс не является очень простым, то в таком описании трудно разобраться. Рекомендуется не использовать сложшые описания локальных классов и не использовать в иерархии вложенности более одной ступени. Кроме того, вложение классов – это не более чем соглашение о записи, поскольку вложенный класс не является скрытым в области видимости лексически охватывающего класса.

class Student {// пример 74

int id;

class Exam {

int idExam;

char name[80];

public:

Exam (int idExam, char* s);

};

Exam* first;

public:

void add(int n, char *s) { first = new Exam(n, s);}

};

Student::Exam::Exam (int idExam, char* s) {

Exam::idExam=idExam;

strcpy(name, s); }

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

class Exam {// пример 75

friend class Student;//объявление дружественного класса

int idExam;

char name[80];

public:

Exam (int idExam, char* s) {

Exam::idExam=idExam;

strcpy(name, s); }

};

class Student {

int id;

Exam* first;

public:

void add(int n, char *s) { first = new Exam(n, s);}

};

ЛИТЕРАТУРА

1. Б.Страуструп, Язык программирования С++. СПб., 1999.

2. Г.Шилдт, Самоучитель С++. 3-е изд. СПб., 2002.

3. Б.Эккель, Философия С++. Введение в стандартный С++. 2-е изд. СПб. :, 2004.

4. Б.Эккель, Ч.Эллисон, Философия С++. Практическое программирование. СПб., 2004.

5. С.В.Глушаков, А.В.Коваль, С.В.Смирнов, Язык программирования С++. Харьков, 2002.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ..............................................................................................................

1. КЛАССЫ. ПЕРВОЕ ЗНАКОМСТВО...........................................................

2. КЛАССЫ И ФУНКЦИИ.................................................................................

3. НАСЛЕДОВАНИЕ, ВИРТУАЛЬНЫЕ ФУНКЦИИ И ПОЛИМОРФИЗМ

4. МАССИВЫ ОБЪЕКТОВ, УКАЗАТЕЛИ И ССЫЛКИ............................

5. ШАБЛОНЫ.........................................................................................................

6. ПОТОКИ И КЛАССЫ ВВОДА/ВЫВОДА..................................................

7. СТАТИЧЕСКИЕ И КОНСТАНТНЫЕ ЧЛЕНЫ, ЛОКАЛЬНЫЕ КЛАССЫ……………………………………………………………………


Учебное издание

Блинов Игорь Николаевич

Романчик Валерий Станиславович

Наши рекомендации