|
Программирование >> Элементы языков с и с++
Листинг 8.2 31.срр : Defines the entry point for the console application. linclude stdafx.h Jinclude <stdio.h> linclude <conio.h> class A protected: int x; /*к этим данным имеют доступ только методы данного класса и производных*/ int у; public: int а; int b; int fl(int X, int y) метод класса { return(x-y); class В : A это объявляется класс, производный от А ( при этом наследуются члены класса А public: int f2(int х) метод класса ( А::х=20; /*здесь могут использоваться члены-данные базового класса из секции protected. Так как имя аргумента метода f2() совпадает с именем поля х из класса А, унаследованного классом В, то чтобы различить, какая переменная к какому классу относится, потребовалось уточнить с помощью спецификатора ::. Показано, что в теле метода х берется тот, что унаследован от А и собственный аргумент х cciMoro метода f2():*/ return(х+А::х); гх C:\WINOOWS\system32Vcmd.exe xl=-10 Х2= 30 Оля продолжения нажмите любую клавишу . Рис. 8.2. Результат работы программы листинга 8.2 Обратите внимание, что когда вы создаете переменную типа класса, т. е. экземпляр класса (например, а min; где min - экземпляр класса), то для этого экземпляра никакой памяти не выделяете, а компилятор все-таки размещает этот экземпляр где-то в памяти. Почему? Среда исполнения приложений в C/C++ выделяет два вида памяти: статическую и динамическую. Последняя носит название куча (heap). Куча может быть управляемой и неуправляемой. Если компилятор способен определить размер памяти под объявленную переменную, то он выделяет для нее место в статической памяти (например, под переменную типа int он выделит 4 байта, а под массив типа int из 10 элементов он выделит 40 байтов). Если же компилятор не в состоянии определить размер памяти под объявленную переменную, то он гютребует от программиста поместить такую переменную в куче- в динамической памяти. Кстати, если программист сам хочет работать с динамической памятью (даже когда компилятор может поместить переменную в статической памяти), то язык это ему позволяет. Для простых переменных при этом используются: функция malloc о, которая выделяет область памяти в динамической области и возвращает указатель на int tmain(int argc, char* argv[]) { A min; создание экземпляров классов A,В В max; min.a=10; Работа с элементами класса А иэ секции public min.6=20; int xl=min.fl (min.a,min.b) ; int x2=max.f2{10); Работа с элементом класса В printf( xl=%d\nx2= %d\n ,xl,x2); getch(); эту область, и функция free (), которая освобождает занятую переменной область и передает освобожденную память в общее пользование. Если же работа происходит с объектами, то здесь используются операторы new-аналог maiioc о, И delete- аналог free О. Указанные функции и аналогичные им операторы работают с неуправляемой кучей. С управляемой к)чей работает утилита gcnew и нет необходимости освобождать самому память от объекта, поскольку в этом случае работает так называемая автоматическая сборка мусора: когда объект становится ненужным, память от него освобождается. Чтобы работать с такой кучей, надо перейти в режим CLR. Что касается вопроса почему? , то очевидно, что компилятор размещает переменную типа класса, объявленного нами, в статической области памяти. Но приведем пример этой же программы, в которой используется (по нашему желанию) динамическая память (мы, естественно, приводим только тело функции main (), где это отражается), int tinain(int argc, char* argv[]) ( A * min =(A *) new A(); создание экземпляров классов A,В В * max= (В *) new В() ; min->a=10; Работа с элементами класса А из секции public rain->b=20; int xl=min->fl (min->a,min->b) ; int x2=max->f2(10); Работа с элементом класса В printf ( xl=%d\nx2= %d\n ,xl,x2); getch(); delete min; delete max; 1 В данном случае оператор new размещает объект в куче, выдает адрес этого объекта, а конструктор инициализирует объект. Пример 2 Создадим класс, членами которого будут изделия, состоящие из деталей и их стоимостей, а также методы, первый из которых присваивает значения изделию, детали и стоимости через свои параметры, а второй выводит на экран значения, присвоенные первым методом. Текст программы приведен в листинге 8.3, результат работы программы представлен на рис. 8.3.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |