Еще о классах в С++
Класс — это механизм для создания объектов. Класс объявляется с помощью ключевого слова class. Синтаксис объявления класса похож на синтаксис объявления структуры. Здесь показана основная форма:
Этот класс имеет одну закрытую переменную а, и две открытые функции: set_a() и get_a(). Прототипы функций объявляются внутри класса. Функции, которые объявляются внутри класса, называются функциями-членами (member functions). Поскольку а является закрытой переменной класса, она недоступна для любой функции вне myclass. Однако поскольку set_a() и get_a() являются членами myclass, они имеют доступ к а. Более того, set_a() и get__a(), являясь открытыми членами myclass, могут вызываться из любой части программы, использующей myclass. Хотя функции set_a() и get_a() и объявлены в myclass, они еще не определены. Для определения функции-члена вы должны связать имя класса, частью которого является функция-член, с именем функции. Это достигается путем написания имени функции вслед за именем класса с двумя двоеточиями. Два двоеточия называются оператором расширения области видимости (scope resolution operator).
Далее показан способ определения функций-членов set_a() и get_a():
Пример. Создается класс stack, реализующий стек, который можно использовать для хранения символов:
Программа выводит на экран следующее:
Внутри функции main() создаются два стека, s1 и s2, и по три символа помещаются в каждый из них. Важно понимать, что один объект (стек) не зависит от другого. Поэтому у символов в s1 нет способа влиять на символы в s2. Каждый объект содержит свою собственную копию stck и tos. Это фундаментальная для понимания объектов концепция. Хотя все объекты класса имеют общие функции-члены, каждый объект создает и поддерживает свои собственные данные.
class myclass { // закрытый элемент класса int a; public; void set_a(int num) int get_a ( ) ; };
Далее показан способ определения функций-членов set_a() и get_a():
void myclass :: set_a (int num) { a=num; } int myclass :: get_a (} { return a; }
#includeusing namespace std; #define SIZE 10 // Объявление класса stack для символов class stack { char stck[SIZE]; // содержит стек int tos; // индекс вершины стека public: stack(); // конструктор void push(char ch); // помещает в стек символ char pop(); // выталкивает из стека символ }; // Инициализация стека stack::stack() { cout << "Работа конструктора стека \n"; tos=0; } // Помещение символа в стек void stack::push(char ch) { if (tos==SIZE) { cout << "Стек полон"; return; } stck[tos]=ch; tos++; } // Выталкивание символа из стека char stack::pop() { if (tos==0) { cout << "Стек пуст"; return 0; // возврат нуля при пустом стеке } tos--; return stck[tos]; } int main() { // образование двух, автоматически инициализируемых, стеков stack s1, s2; int i; s1.push('a'); s2.push('x'); s1.push('b'); s2.push('y'); s1.push('c'); s2.push('z'); for(i=0; i<3; i++) cout << "символ из s1:" << s1.pop() << "\n"; for(i=0; i<3; i++) cout << "символ из s2:" << s2.pop() << "\n"; return 0; }
символ из s1: с символ из s1: b символ из s1: a символ из s2: z символ из s2: y символ из s2: хПроанализируем программу. Класс stack содержит две закрытые переменные: stck и tos. Массив stck содержит символы, фактически помещаемые в стек, a tos содержит индекс вершины стека. Открытыми функциями стека являются init(), push() и рор(), которые, соответственно, инициализируют стек, помещают символ в стек и выталкивают его из стека.
Внутри функции main() создаются два стека, s1 и s2, и по три символа помещаются в каждый из них. Важно понимать, что один объект (стек) не зависит от другого. Поэтому у символов в s1 нет способа влиять на символы в s2. Каждый объект содержит свою собственную копию stck и tos. Это фундаментальная для понимания объектов концепция. Хотя все объекты класса имеют общие функции-члены, каждый объект создает и поддерживает свои собственные данные.