Пример создания одномерного динамического массива
Для примера приведем участок кода программы для одномерного динамического массива с использованием операций 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 = new int*[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;
. . .
Дополнительные возможности при работе с пользовательскими функциями
Параметры со значениями по умолчанию
Чтобы упростить вызов функции, в ее заголовке можно указать значения параметров по умолчанию. Эти параметры должны быть последними в списке и при вызове функции аргументы для них могут опускаться. Если при вызове аргумент опущен, то должны отсутствовать и все аргументы, стоящие за ним, т.к. задавать значения по умолчанию можно только для последних параметров в списке функции.
В качестве значений параметров по умолчанию могут использоваться константы или константные выражения.
Параметр по умолчанию проходит проверку типа во время описания функции и вычисляется во время ее вызова.
Пример участка кода функции, определяющей сумму переменных отношений от 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;
int y2, у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)
. . .
return 0;
}
Таким образом:
1. Умалчиваемое значение аргумента функции задается при его объявлении в заголовке функции.
2. В начале списка указывают параметры, значения которых будут передаваться всегда.
3. При обращении пропуск умалчиваемых параметров в списке недопустим, т.е. для получения значения x1 + x2 + x3 + x5 вызов функции Sum (х1, х2, х3, х5); приведет к ошибочному результату.
Правильным будет обращение Sum(x1, x2, x3, 0, x5);
Перегрузка функций
В языке С++ реализована возможность использования одного идентификатора для функций, выполняющих различные действия над различными типами данных, в результате чего можно использовать несколько функций с одним и тем же именем, но с разными списками параметров, как по количеству, так и по типу.
Такие функции называют перегруженными, а сам механизм – перегрузка функций.
Компилятор определяет, к какой из функций с одним и тем же именем следует обратиться путем сравнения типов фактических аргументов с типами формальных параметров в заголовках всех этих функций, т.е. компилятор в зависимости от типа и количества аргументов будет формировать необходимое обращение к соответствующей функции.
Поиск функции, которую надо вызвать, осуществляется за три отдельных шага:
1. Поиск функции с точным соответствием параметров и ее использование, если она найдена.
2. Поиск соответствующей функции, используя встроенные преобразования типов данных.
3. Поиск соответствующей функции, используя преобразования, определенные пользователем.
Пример перегрузки функций
Приведем пример функции S1 с двумя параметрами х, у, работающая в зависимости от типа передаваемых аргументов, следующим образом:
– если тип параметров целочисленный, функция S1 складывает их значения и возвращает полученную сумму;
– если тип параметров long, функция S1 перемножает их значения и возвращает полученное произведение;
– если тип параметров вещественный, функция S1 делит их значения и возвращает частное от деления.
# include <stdio.h>
int S1 (int x, int y) {
return x+y;
}
long S1 (long x, long y) {
return x*y;
}
double S1 (double x, double y) {
return x/y;
}
int main ()
{
int a = 1, b = 2, c;
long i = 3, j = 4, k;
double x = 10, y = 2, z;
c=S1(a, b);
k=S1(i, j);
z=S1(x, y),
printf("\n c = %d; k = %ld; z = %lf . \n", c, k, z);
return 0;
}
В результате получим:
c = 3; k = 12; z = 5.000000 .