Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_Obektno-orientirovannoe_programmirovan...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
351.74 Кб
Скачать

2.1. Перегрузка имен функций

Компилятор С++ различает функции не только по именам, но и по типу аргументов. Если функции выполняют одни и те же действия над объектами различных типов, то целесообразно им дать одно и то же имя.

Пример использования этого механизма приведен в листинге 2.1.

// Листинг 2.1. Перегрузка имен функций

#include <stdio.h>

//Прототипы трех функций с одним и тем же именем и разными

//типами параметров

void print(int i);

void print(long i);

void print(double i);

int main(void)

{

print(200);

print(2000000L);

print(3.14159);

return 0;

}

void (int i)

{

printf("%d\n",i) ;

}

void print(long i)

{

printf("%ld\n",i) ;

}

void print(double i)

{

printf("%lf\n",i) ;

}

В листинге 2.1 показано использование трех функций с именем print() и с различными типами аргументов. Вызов функции print() компилятор свяжет с тем или иным ее определением в зависимости от типа переданного аргумента.

Примечание.

Компилятор не различает функции по типу возвращаемого значения, поэтому перегружаемые функции не могут иметь различные типы возвращаемого значения, например ошибочными являются следующие объявления:

Int print(int);

Void print(int);

2.2. Динамическое распределение памяти

Для распределения памяти под динамические данные в процессе исполнения программы можно использовать библиотечные функции языка С malloc(), farmalloc() и другие. Неудобство их заключается в том, что программист вынужден заниматься сам расчетами по выделению необходимого объема памяти.

В С++ для этого предлагается унарный оператор new, синтаксис которого имеет вид:

Указатель на тип = new имя<(инициализатор)>;

Оператор new создает в памяти объект, тип которого определяется операндом и возвращает указатель на объект.

Например, объявление:

int *ip=new int;

создаст динамический неинициализированный объект целого типа, а объявление

int *ip=new int(3);

создаст динамический объект целого типа с инициализацией его значением 3.

Освободить память, распределенную операцией new, можно с помощью оператора delete, например

delete ip;

Удаление указателя означает освобождение выделенной памяти для последующего ее использования.

Примечание.

Память, полученная оператором new, будет распределена до тех пор, пока она явно не будет освобождена оператором delete. Это очень важный момент, так как при выходе из блока локальный указатель, содержащий адрес памяти, полученный оператором new, уничтожается, тогда, как память остается распределенной, т.е. автоматически она не освобождается. В результате к этой памяти невозможно будет обратиться.

Часто new используется для динамического распределения памяти под массив, например:

double *a;

int n=10;

a=new double[n];

или:

double *a= new double[10];

Здесь [] указывают, что распределяется память под массив объектов, а не под простую переменную.

Закончив использование массива, следует удалить его:

delete[] a;

При объявлении указателя на двух- или трехмерный массив следует указать количество элементов во второй и последующих позициях, например:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]