    8-символьных столбцах с помощью цикла for в строках 17-20. Строка 21 
удаляет массив, используя пустые скобки в выражении delete[] для того, чтобы, 
как и в предыдущем листинге, указать компилятору, что удаляется массив, а не 
одно целое значение. 

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

    Для объявления указателя на двух- или трехмерный массив (или большей 
размерности) укажите количество элементов во второй и последующей позициях. 
Например, вы хотите выделить пространство для массива 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; 


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

    Даже если вы только начали программировать, наверняка вы столкнулись с 
проблемой придумывания новых имен для функций. Конечно, вы можете придумать 
любое имя для функции — компилятор воспримет с одинаковым энтузиазмом функцию 
как с именем f29q(), так и названную BattingAverage(). Многие, конечно, 
предпочтут последний вариант. 
    В больших программах с этим шутить не стоит. Представим себе программу, 
которая должна рисовать несколько различных фигур. Каждая функция отрисовки 
имеет свое собственное имя, что делает код "усыпанным" функциями типа 
DrawEllipse, DrawCircle, DrawSquare, DrawLine и т.д. Код, вероятно, будет 
содержать также много переменных, названных ellipse, circle, square и line, и, 
в конце концов, мы получим программу, словно написанную заикой: 

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

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

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

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


    294	Часть III. Программирование на ANSI C++ 
