Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Использование динамических массивовСодержание книги
Поиск на нашем сайте
Конечно, строки — это те же символьные массивы, и тот факт, что new и delete также могут использоваться для создания и освобождения динамических массивов любого типа, не будет для вас сюрпризом. Листинг 1.12 демонстрирует это. Листинг 1.12. NEWARRAY.CPP (объявление массивов с помощью new) 1: 1: #include <iostream.h> 2: 3: #define COUNT 100 // Количество целых значений 4: 5: main() 6: { 7: int *array; // Массив целых значений 8: int i; // Индекс массива 9: 10: array = new int[COUNT]; 11: 12: // Заполнение массива 13: for (i = 0; i < COUNT; i++) 14: array[i] = i; 15: 16: // Вывод содержимого массива 17: for (i = 0; i < COUNT; i++) { 18: cout.width(8); 19: cout << array[i]; 20: } 21: delete[ ] аггау; 22: return 0; 23: }
В этом примере в строке 7 объявляется указатель на массив целых значений. В строке 10 используется new для выделения места для 100 целых значений. Затем массив заполняется значениями от 0 до 99 и выводится в 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; Перегрузка функций Пример: программа, которая должна рисовать несколько различных фигур. Каждая функция прорисовки имеет свое собственное имя, что делает код "усыпанным" функциями типа 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: } 19:int square(int а) 20:{ 21: return а * а; 22: } 24:double square(double а) 25:{ 26: return а * а; 27: } 29:long double square(long double a) 30:{ 31: return а * а; 32: } Прототипы трех перегруженных функции square() определены в строках 3-5. Все функции имеют одинаковое имя, но, тем не менее, они различны, поскольку каждая из них отличается хотя бы одним параметром от другой. Сами функции реализованы в строках 19-32 как раздельные, т.е. имеющие различные имена. В строках 13-15 показано, как перегруженные функции могут прояснять суть программы. Несмотря на различия в типах данных, очевидно, что каждый оператор выводит квадрат аргумента. Это куда более приятно, чем различать функции по именам типа squareInt(), squareDouble() и squareLongDouble(). Конечно, решать, стоит ли перегружать функции, которые выполняют более или менее схожую работу, придется вам. Если вы назовете все функции в вашей программе одним и тем же именем (с учетом того, что они должны отличаться хотя бы одним своим аргументом), то ваш код может стать совершенно непостижимым, как новелла, представляющая собой многократное повторение одного и того же слова.
|
|||||||
Последнее изменение этой страницы: 2016-08-01; просмотров: 121; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.166.224 (0.009 с.) |