|
Программирование >> Инициализация объектов класса, структура
#include <iostream> #include <vector> const lineLength =12; коJ void putValues( vector<int> оличество элементов в строке vec ) cout << ( << vec.size() << )< ; for ( int i = 0; i < vec.size(); ++1 ) { if ( i % lineLength == 0 ss i ) cout << \n\t ; строка заполнена cout << vec[ i ]; раздетель, печатаем после каждого элемента, кроме последнего if ( 1 % lineLength != lineLength-1 ss i != vec.size()-1 ) cout << , ; cout << >\n ; void putValues( vector<int> ); int main() { int i, j[ 2 ]; присвоить i и j некоторые значения vector<int> vec1(1); создадим вектор из 1 элемента vecl[0] = i; putValues( vecl ); vector<int> vec2; создадим пустой вектор добавим элементы к vec2 for ( int ix = 0; ix < sizeof( j ) / sizeof( j[0] ); ++ix ) vec2[ix] == j [ix] vec2.push back( j [ix] ); putValues( vec2 ); return 0; Функция miain(), вызывающая нашу новую функцию putValues (), выглядит так: Заметим, что параметр putValues() передается по значению. В подобных случаях контейнер со всеми своими элементами всегда копируется в стек вызванной функции. Поскольку операция копирования весьма неэффективна, такие параметры лучше объявлять как ссылки. Как бы вы изменили объявление putValues() ? Вспомним, что если функция не модифицирует значение своего параметра, то предпочтительнее, чтобы он был ссылкой на константный тип: void putValues( const vector<int> s ) { ... char *cursor; эквивалентно screenInit(24,80, ) cursor = screenInit(); эквивалентно screenInit(66,80, ) cursor = screenlnit(66); эквивалентно screenInit(66,256, ) cursor = screenlnit(66, 256); корректны: cursor = screenlnit(66, 256, #); Фактические аргумента: сопоставляются с формальными параметрами нозиционно (в порядке следования), и значения но умолчанию могут использоваться только для подстановки вместо отсутствующих последних аргументов. В нашем примере эквивалентно screenInit(?,80, ) cursor = screenlnit (?); ошибка, неэквивалентно screenInit(24,80,?) невозможно задать значение для background, не задавая его для height и width. cursor = screenInit( , ,?); При разработке функции с параметрами по умолчанию придется позаботиться об их расположении. Те, для которых значения по умолчанию вряд ли будут употребляться, необходимо поместить в начало списка. Функция screenInit() предполагает (возможно, основываясь на опыте применения), что параметр height будет востребован пользователем наиболее часто. 7.3.5. Значения параметров по умолчанию Значение параметра по умолчанию - это значение, которое разработчик считает подходящим в большинстве случаев употребления функции, хотя и не во всех. Оно освобождает программиста от необходимости уделять внимание каждой детали интерфейса функции. Значения по умолчанию для одного или нескольких параметров функции задаются с помощью того же синтаксиса, который употребляется при инициализации переменных. Например, функция для создания и инициализации двумерного массива, моделирующего экран терминала, может использовать такие значения для высоты, ширины и символа char *screenInit( int height = 24, int width = 80, фона экрана: char background = ); Функция, для которой задано значение параметра но умолчанию, может вызываться но-разному. Если аргумент опущен, используется значение по умолчанию, в противном случае - значение переданного аргумента. Все следующие вызовы screenInit() ошибка: width должна иметь значение по умолчанию, если такое значение имеет height char *screenlnit( int height = 24, int width, указаны. char background = ); Значение по умолчанию может указываться только один раз в файле. Следующая запись tf.h int ff( int = 0 ); ft.С #include ff.h ошибочна: int ff( int i = 0) { ... } ошибка По соглашению значение задается в объявлении функции, которое размещается в общедоступном заголовочном файле (описывающем интерфейс), а не в ее определении. Если же указать его в определении, это значение будет доступно только для вызовов функции внутри исходного файла, содержащего это определение. Можно объявить функцию повторно и таким образом задать дополнительные параметры по умолчанию. Это удобно при настройке универсальной функции для конкретного приложения. Скажем, в системной библиотеке UNIX есть функция chmod(), изменяющая режим доступа к файлу. Ее объявление содержится в системном заголовочном файле <cstdlib>: int chmod( char *filePath, int protMode ); protMode представляет собой режим доступа, а filePath - имя и каталог файла. Если в некотором приложении файл только читается, можно переобъявить функцию chmod() , задав для соответствующего параметра значение по умолчанию, чтобы не указывать его #include <cstdlib> при каждом вызове: int chmod( char *filePath, int protMode=0444 ); Если функция объявлена в заголовочном файле так: file int ff( int a, int b, int с = 0 ); ff.h то как переобъявить ее, чтобы присвоить значение по умолчанию для параметра b? Следующая строка ошибочна, поскольку она повторно задает значение для с: Значения по умолчанию могут задаваться для всех параметров или только для некоторых. При этом параметры без таких значений должны идти раньше тех, для которых они
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |