Здавалка
Главная | Обратная связь

Многомерные динамические массивы



Для объявления указателя на двух- или трехмерный массив (или большей размерности) надо указать количест­во элементов во второй и последующей позициях. Например, для массива 10x20 вещественных значений двойной точности:

int (*matrix)[20];

Оно определяет matrix, как указатель на массив из 20 целых. Вы должны заключить в круглые скобки (*matrix), поскольку квадратные скобки массива имеют больший приоритет, чем символ указателя *. Целых значений еще даже не существует; все что вы сделали — только дали указание компилятору, что matrix — указатель на массив определенного размера.

Чтобы выделить память для матрицы размером 10x20 и присво­ить ее адрес переменной matrix,надо:

matrix = new int[10][20];

Оператор new выделяет память для массива. Адрес, получившийся в результате, присваивается matrix. Для создания куба 8x8x8 следует написать следующее:

int (*matrix)[8][8];

matrix = new int[8][8][8];

Такое объявление matrix определяет вторую и третью размерность массива, указывая компилятору, что matrix адресует массив целых значений размерностью 8x8. Выражение new определяет все три измерения, вы­деляя пространство для указанного числа массивов 8x8, другими словами — трехмерного куба.

При вьщелении пространства для многомерного массива первый индекс может быть переменной, а второй и последующие должны быть константами. Например, если целая переменная v равна 40, то следующие строки

int (*matrix)[20];

matrix = new int[v][20];

выделяют пространство для двухмерного массива размерностью 40x20 элементов целых значений, адресуемого matrix.

Удаление многомерных массивов любой размерности происходит так, как будто они имеют лишь одно измерение:

delete[] matrix;

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

Пример: программа, которая должна рисовать не­сколько различных фигур. Каждая функция прорисовки имеет свое собственное имя, что делает код "усыпан­ным" функциями типа DrawEllipse, DrawCircle, DrawSquare, DrawLine и т.д мы получим программу, словно написанную заикой:

DrawEllipse(ellipse); DrawCircle(circle); DrawSquare(square); DrawLine(line);

Не будет ли лучше, если вы используете одно и то же имя функции (назовем ее Draw) для вывода всех фигур?

Draw(ellipse); Draw(circle); Draw(square); Draw(line);

В С++ многочисленные функции могут иметь одинаковое имя до тех пор, пока они отличаются хотя бы одним параметром. Функции "перегружены", поскольку их имена одинаковы, а выполняемая ими работа — различна.

Многие функции Draw в нашей гипотетической графической программе остаются раздельными и различными, и написаны точно так же, как и другие не перегруженные функции. Но компилятор С++ распознает их по тому, как они используются, а не только по их именам.

Пример: В листинге 1.13 ис­пользуются перегруженные функции для отображения квадратов трех различных значений.

Листинг 1.13. OVERLOAD.CPP (перегрузка функций)

1:#include <iostream.h>

2:

3:int square(int а);

4:double square(double а);

5:long double square(long double a);

6:

Main()

8:{

9: int x = 10;

10 double у = 20.5;

11 long double z = 30.75;

12:

13: cout << square(x) << '\n';

14: cout << square(y) << '\n';

15: cout << square(z) << '\n';

16: return 0;

17: }
18:

Int square(int а)

20:{

21: return а * а;

22: }
23:







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.