|
Программирование >> Расширенная версия языка c++
class myclass { , : , . .c . . int x; . ... j public: /* Использование аргумента по умолчанию вместо перегрузки конструктора myclass (int n = 0) ( x = n; } j г. int getxO ( return x; } int mainO myclass ol{10); объявление с начальным значением myclass o2; объявление без начального значения cout ol: << ol.getxO \n; cout o2: o2.getx() \n; return 0; Как показано в это epe, путем передачи по умолчанию параметру n нулевого значения, можно создавать не только объекты, имеющие явно заданные начальные значения, но кие, для которых достаточно значений, задаваемых по умолчанию. 4. Другим хорошим применением аргумента по умолчанию является случай, когда с помощью такого параметра происходит выбор нужного варианта развития событий. Можно передать параметру значение по умолчанию так, чтобы использовать его в качестве флага, coo6maromcjt) функции о необходимости продолжить работу в обычном режиме. Например, в следующей программе функция print() выводит строку на экран. Если параметр how равен значению ignore, текст выводится в том виде, в каком он задан. Если параметр how равен значению upper, текст выводится в верхнем регистре. Если параметр how равен значению lower, текст выводится в нижнем регистре. Если параметр how не задан, его значение по умолчанию равно -[, что говорит функции о необходимости повторно использовать его предыдущее значение. ttinclude <iostream> ttinclude <cctype> -о . :i . . using namespace std; const int ignore = 0; const int upper 1; const int lower = 2; voi (char *s, int how = -1) ; int f print ( Привет\n , ignore) ; , 1 I - - /* Печать строки в заданном регистре. Использование заданного последним регистра, если он не задан. void print (char s, int how) -. static int oldcase = ignore; ..,.) , повторять работу с прежним регистром, если новый не задан how oldcase; while (*g) { switch(how) { case upper: cou;< (char) toupper(*s); break; case lower: cout <<. (char) tolower(*3); break; default:- cout *з; oldcase = how; Эта программа выводит следующее: и и Привет ПРИВЕТ 11- . г с- . ПРИВЕТ j - . .1 . ; привет : -.: это конец * . , 5. Ранее в этой главе мы рассматривали общую форму конструктора копий. В этой общей форме имелся только один параметр. Однако вполне возможно создавать конструкторы копий, получающие дополнительные аргументы, если только это аргументы по умолчанию. Например, вполне приемлема следующая форма конструктора копий: myclass(const myclass Sobj, int x=0) ( тело конструктора print( Привет \п , upper); print ( Привет \n ) ; продолжение вывода хнем регистре print ( Привет \п , lower) ; print ( Это коне ) ; продолжение в(=гоода , - , в нижнем регистре return 0; - Поскольку первый аргумент является ссылкой на копируемый объект, а все остальные - это аргументы по умолчанию, эту функцию можно квалифицировать как конструктор копий. Такая гибкость позволяет создавать самые разнообразные конструкторы копий. 6. Хотя аргументы по умолчанию являются мощным и удобным инструментом, ими нельзя злоупотреблять. Несомненно, что при правильном применении аргументы по умолчанию позволяют функции выполнять свою работу эффективным и простым по реализации образом. Однако так происходит лишь тогда, когда переданное по умолчанию значение имеет смысл. Например, если аргумент, используемый в девять или десять раз чаще других, передать функции по очевидно, это неплохо. Однако в случае, если нет значения, используемого чащ гих., или нет выгоды от аргумента по умолчанию в качестве флага, то нет большого смысла передавать что-либо по умолчанию. Фактически, обеспечение передачи аргумента по умолчанию, когда это не вызвано необходимостью, ограничивает возможности вашей программы и вводит в заблуждение всех пользователей такой функции. Как и при перегрузке функций, хороший программист в каждом конкретном случае всегда сумеет определить, стоит или нет пользоваться аргументом по умолчанию. 1. В стандартной библиотеке C++ существует функции о1(), имеющая следующий прототип: lon (const cha art, cons nd, int base); Функция преобразует обозначающую число строку, на которую ссылается указатель start, в длинное целое. Число base задает основание системе! счисления этого числа. При возвращении функцией своего значения указатель end ссылается на символ в строке, следующий сразу за последней цифрой строки. Возвращаемое длинное целое эквивалентно тому числу, которое записано в строке. Диапазон значений base от 2 до 38. Однако наиболее часто основание системы счисления равно 10. Создайте функцию mystrtol(), работающую точно так же, как и функция strtolO, но аргумент 10 должен передаваться параметру base по умолчанию. (Свободно пользуйтесь функцией для фактического преобразования. этого в программу требуется включить заголовок Ub>.) Покажите, что ваша версия работает правильно. 2. Что неправильно в следующем прототипе функции? cha char *p, int = О, char *g) ; 3. В большинстве C++ применяются нестандартные функции, управляющие позиционированием курсора и другими аналогичными деист-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |