Программирование >>  Элементы языков с и с++ 

1 ... 51 52 53 [ 54 ] 55 56 57 ... 200


Листинг 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.



1 ... 51 52 53 [ 54 ] 55 56 57 ... 200

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