Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода по ОАиП.doc
Скачиваний:
12
Добавлен:
11.05.2015
Размер:
3.21 Mб
Скачать

16.4. Операции new и delete

В языке С++ для захвата и освобождения памяти используется более простой механизм – операции newиdelete. Рассмотрим эти операции на простых примерах:

1) type*p=newtype(значение); – захват участка памяти размеромsizeof(type), путем установки на него указателя, и запись в эту область указанного значения;

. . .

deletep; – освобождение захваченной памяти.

2) type*p=newtype[n]; – захват памяти наnпоследовательно размещенных объектов, возвращает указатель на начало участка ОП размеромn*sizeof(type); используется для создания массива;

. . .

delete[]p; – освобождение всей захваченной памяти.

Следует заметить, что операция deleteне уничтожает значения, находящиеся по указанным адресам, а дает компилятору разрешение использовать ранее занятую память в дальнейшем.

Квадратные скобки в операции delete[ ] при освобождении памяти, занятой массивом, обязательны. Их отсутствие может привести к непредсказуемым результатам.

Пример создания одномерного динамического массива

Для примера приведем участок кода программы для одномерного динамического массива с использованием операций newиdelete.

Напомним, что результатом операции newявляется адрес начала области памяти для размещения данных, указанного количества и типа. При нехватке памяти результат равенNULL.

double *x;

int i, n;

puts(" Введите размер массива: ");

scanf(“%d”, &n);

x = new double [n] ;

if (x = = NULL) {

puts(" Ошибка ! ");

return;

}

for (i=0; i<n; i++) // Ввод элементов массива

scanf(“%lf”, &x[i]);

 // Обработка массива

delete [ ]x; // Освобождение памяти

Пример создания двухмерного динамического массива

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

. . .

int**m,n1,n2,i,j;

puts(" Введите размеры массива (строк, столбцов): ");

scanf(“%d%d”, &n1, &n2);

m=newint*[n1]; // Захват памяти для указателей –А(n1=3)

for(i=0;i<n1;i++) // Захват памяти для элементов

*(m+i) = new int[n2];

for ( i=0; i<n1; i++)

for ( j=0; j<n2; j++)

m[i] [j] = i+j; // *(*(m+i)+j) = i+j;

. . .

for ( i=0; i<n1; i++) // Освобождение памяти

delete []m[i];

delete[]m;

. . .

16.5. Дополнительные возможности при работе с пользовательскими функциями Параметры со значениями по умолчанию

Чтобы упростить вызов функции, в ее заголовке можно указать значения параметров по умолчанию. Эти параметры должны быть последними в списке и при вызове функции аргументы для них могут опускаться. Если при вызове аргумент опущен, то должны отсутствовать и все аргументы, стоящие за ним, т.к. задавать значения по умолчанию можно только для последних параметров в списке функции.

В качестве значений параметров по умолчанию могут использоваться константы или константные выражения.

Параметр по умолчанию проходит проверку типа во время описания функции и вычисляется во время ее вызова.

Пример участка кода функции, определяющей сумму переменных отношений от 2-х до 5-ти:

. . .

int sum(int a, int b, int c=0, int d=0, int e=0) { // 0 – умалчиваемые значения

return (a+b+c+d+e);

}

int main ()

{

int x1=1, x2=2, x3=3, x4=4, x5=5;

inty2, у3, у4, у5;

у2= Sum(х1, х2); // Работают все умалчиваемые значения;

у3= Sum(х1, х2, х3); // – два последних значения;

у4= Sum(х1, х2, х3, х4); // – одно последнее значение;

у5= Sum(х1, х2, х3, х4, х5)

. . .

return0;

}

Таким образом:

1. Умалчиваемое значение аргумента функции задается при его объявлении в заголовке функции.

2. В начале списка указывают параметры, значения которых будут передаваться всегда.

3. При обращении пропуск умалчиваемых параметров в списке недопустим, т.е. для получения значенияx1 +x2 +x3 +x5 вызов функцииSum(х1,х2,х3,х5); приведет к ошибочному результату.

Правильным будет обращение Sum(x1,x2,x3, 0,x5);