|
Программирование >> Инициализация объектов класса, структура
void putValues( int[], int size ); int main() { int i, j[ 2 ]; putValues( &i, 1 ) ; putValues( j, 2 ); return 0; параметр функции. Например: putValues() печатает элементы массива в следующем формате: P ( 10 )< 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 > где 10 - это размер массива. Вот как выглядит реализация putValues(), в которой #include <iostream> const lineLength =12; ко, void putValues( int *ia, in { cout << ( << sz << for (int i=0;i<sz; ++i оличество элементов в строке int *ia, int sz ) )< ; ++i ) if ( i % lineLength == 0 && i ) cout << \n\t ; строка заполнена cout << ia[ i ]; раздетель, печатаем после каждого элемента, кроме последнего if ( i % lineLength != lineLength-1 && i != sz-1 ) cout << , ; cout << >\n ; используется дополнительный параметр: Другой способ сообщить функции размер массива-параметра - объявить параметр как ссылку. В этом случае размер становится частью типа, и компилятор может проверить аргумент в полной мере. По принятому соглашению С-строка является массивом символов, последний элемент которого равен нулю. Во всех остальных случаях при передаче массива в качестве параметра необходимо указывать его размер. Это относится и к массивам символов, внутри которых встречается 0. Обычно для такого указания используют дополнительный параметр - сс1лка на массив из 10 це void putValues( int (sarr)[10] ); int main() { int i, j [ 2 ]; putValues(i); ошибка: аргумен putValues(j); ошибка: аргумент не является массивом из 10 цел return 0; аргумент не является массивом из 10 цел Поскольку размер массива теперь является частью типа параметра, новая версия putValues() способна работать только с массивами из 10 элементов. Конечно, это #include <iostream> void putValues( int (sia)[10] ) cout << ( 10 )< ; for ( int 1 =0; i < 10; ++i ) { cout << ia[ i ]; раздетель, печатаем после каждого элемента, кроме последнего if ( i != 9 ) cout << , ; cout << >\n ; ограничивает ее область применения, зато реализация значительно проще: Еще один способ получить размер переданного массива в функции - использовать абстрактный контейнерный тип. (Такие типы были представлены в главе 6. В следующем подразделе мы поговорим об этом подробнее.) Хотя две предыдущих реализации putValues() правильны, они обладают серьезными недостатками. Так, первый вариант работает только с массивами типа int. Для типа double* нужно писать другую функцию, для long* - еще одну и т.д. Второй вариант производит операции только над массивом из 10 элементов типа int. Для обработки массивов разного размера нужны дополнительные функции. Лучшим решением было бы использовать шаблон - функцию, или, скорее, обобщенную реализацию кода целого семейства функций, которые отличаются только типами обрабатываемых данных. Вот как можно сделать из первого варианта putValues() шаблон, способный работать с template <class Type> void putValues( Type *ia, int sz ) так же, как и раньше массивами разных типов и размеров: Параметры шаблона заключаются в угловые скобки. Ключевое слово class означает, что идентификатор Type служит именем параметра, при конкретизации шаблона функции putValues() он заменяется на реальный тип - int, double, string и т.д. (В главе 10 мы продолжим разговор о шаблонах функций.) Параметр может быть многомерным массивом. Для такого параметра должны быть заданы правые границы всех измерений, кроме первого. Например: putValues( int matrix[] [10], int rowSize ); Здесь miatrix объявляется как двумерный массив, который содержит десять столбцов и неизвестное число строк. Эквивалентным объявлением для miatrix будет: int (*matrix)[10] Многомерный массив передается как указатель на его нулевой элемент. В нашем случае тип matrix - указатель на массив из десяти элементов типа int. Как и для одномерного массива, граница первого измерения не учитывается при проверке типов. Если параметры являются многомерными массивами, то контролируются все измерения, кроме первого. Заметим, что скобки вокруг *matrix необходимы из-за более высокого приоритета операции взятия индекса. Инструкция int *matrix[10] ; объявляет matrix как массив из десяти указателей на int. 7.3.4. Абстрактные контейнерные типы в качестве параметров Абстрактные контейнерные типы, представленные в главе 6, также используются для объявления параметров функции. Например, можно определить putValues() как имеющую параметр типа vector<int> вместо встроенного типа массива. Контейнерный тип является классом и обеспечивает значительно большую функциональность, чем встроенные массивы. Так, vector<int> знает собственный размер. В предыдущем подразделе мы видели, что размер параметра-массива неизвестен функции и для его передачи приходится задавать дополнительный параметр. Использование vector<int> позволяет обойти это ограничение. Например, можно изменить определение нашей putValues() на такое:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |