|
Программирование >> Инициализация объектов класса, структура
#include ff.h Так выглядит правильное объявление: int ff( int a, int b = 0, int с ); правильно В том месте, где мы переобъявляем функцию ff() , параметр b расположен правее других, не имеющих значения по умолчанию. Поэтому требование присваивать такие #include ff.h int ff( int a, int b = 0, int с ); правильно значения справа налево не нарушается. Теперь мы можем переобъявить ff() еще раз: int ff( int a = 0, int b, int с ); правильно Значение по умолчанию не обязано быть константным выражением, можно использовать int aDefault() ; int bDefault( int ); int cDefault( double = 7.8 ); int glob; int ff( int a = aDefault() , int b = bDefau1t( glob ) , любое: int с = cDefault() ); Если такое значение является выражением, то оно вычисляется во время вызова функции. В примере выше cDefault() работает каждый раз, когда происходит вызов функции ff() без указания третьего аргумента. 7.3.6. Многоточие Иногда нельзя перечислить типы и количество всех возможных аргументов функции. В этих случаях список параметров представляется многоточием (...), которое отключает механизм проверки типов. Наличие многоточия говорит компилятору, что у функции может быть произвольное количество аргументов неизвестных заранее типов. void foo( parm list, ... ); Многоточие употребляется в двух форматах: void foo( ... ); i #include ff.h int ff( int a, int b = 0, int с = 0 ); ошибка void f(); Отметим, что следующие объявления неэквивалентны: void f( ... ); В первом случае f() объявлена как функция без параметров, во втором - как имеющая f( someValue ); ноль или более параметров. Вызовы f( cnt, a, b, с ); корректны только для второго объявления. Вызов f(); применим к любой из двух функций. Упражнение 7.4 Какие из следующих объявлений содержат ошибки? Объясните. Первый формат предоставляет объявления для части параметров. В этом случае проверка типов для объявленных параметров производится, а для оставшихся фактических аргументов - нет. Запятая после объявления известных параметров необязательна. Примером вынужденного использования многоточия служит функция printf() стандартной библиотеки С. Ее первый параметр является C-строкой: int printf( const char* ... ); Это гарантирует, что при любом вызове printf() ей будет передан первый аргумент типа const char*. Содержание такой строки, называемой форматной, определяет, необходимы ли дополнительные аргументы при вызове. При наличии в строке формата метасимволов, начинающихся с символа %, функция ждет присутствия этих аргументов. Например, вызов printf( hello, world\n ); имеет один строковый аргумент. Но printf( hello, %s\n , userName ); имеет два аргумента. Символ % говорит о наличии второго аргумента, а буква s, следующая за ним, определяет его тип - в данном случае символьную строку. Большинство функций с многоточием в объявлении получают информацию о типах и количестве фактических параметров по значению явно объявленного параметра. Следовательно, первый формат многоточия употребляется чаще. void print( int arr[][], int size ); (b) int ff( int a, int b = 0, int с = 0 ); (d) char *screenInit( int height = 24, int width, char background ); (c) void operate( int *matrix[] ); (e) void putValues( int (&ia)[] ); Упражнение 7.5 (a) char *screenInit( int height, int width, char background = ); char *screenInit( int height = 24, int width, char background ); (b) void print( int (*arr)[6], int size ); void print( int (*arr)[5], int size ); (c) void manip( int *pi, int first, int end = 0 ); Повторные объявления всех приведенных ниже функций содержат ошибки. Найдите их. void manip( int *pi, int first = 0, int end = 0 ); Упражнение 7.6 void print( int arr[][5], int size ); void operate(int *matrix[7]); char *screenInit( int height = 24, int width = 80, Даны объявления функций. char background = ); (a) screenInit(); (b) int *matrix[5]; operate( matrix ); (c) int arr[5][5]; Вызовы этих функций содержат ошибки. Найдите их и объясните. print( arr, 5 ) ; Упражнение 7.7 Перепишите функцию putValues( vector<int> ), приведенную в подразделе 7.3.4, так, чтобы она работала с контейнером list<string>. Печатайте по одному значению на строке. Вот пример вывода для списка из двух строк: I ( 2 )
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |