Многомерные динамические массивы
Для объявления указателя на двух- или трехмерный массив (или большей размерности) надо указать количество элементов во второй и последующей позициях. Например, для массива 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: } Int square(int а) 20:{ 21: return а * а; 22: } ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|