Программирование >>  Инициализация объектов класса, структура 

1 ... 107 108 109 [ 110 ] 111 112 113 ... 395


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() на такое:



1 ... 107 108 109 [ 110 ] 111 112 113 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика