|
Программирование >> Процедурные приложения
в переменную значение, полученное от пользователя. Помимо этого, в конструкторе можно присвоить данной переменной значение по умолчанию, например: coins() { cout<< Начало вычислений.\n ; number= 431; } конструктор Тут будет уместно упомянуть о том, что переменные-члены классов, в отличие от обычных переменных, не могут быть инициализированы напрямую с помощью оператора присваивания: classcoins { intnumber= 431; недопустимая инициализация Вот почему все подобные операции приходится помещать в конструктор. Резервирование и освобождение памяти Другой важной задачей, решаемой с помощью конструктора, является выделение динамической памяти. В следующем примере конструктор с помощью оператора newрезервирует блок памяти для указателя string1. Освобождение занятой памяти выполняет деструктор при удалении объекта. Этой цели служит оператор delete. class string operation { char *string1; int string len; public: string operation(char*) ( string1 = new char[string len]; } ~string operation() { delete stringl; } void input data(char*); void output data(char*); ); Память, выделенная для указателя string1 с помощью оператора new, может быть освобождена только оператором delete. Поэтому если конструктор класса выделяет память для какой-нибудь переменной, важно проследить, чтобы в деструкторе эта память обязательно освобождалась. Области памяти, занятые данными базовых типов, таких как intили float, освобождаются системой автоматически и не требуют помощи конструктора и деструктора. Перегрузка функций-членов класса Функции-члены класса можно перегружать так же, как и любые другие функции в C++, т.е. в классе допускается существование нескольких функций с одинаковым именем. Правильный вариант функции автоматически выбирается компилятором в зависимости от количества и типов аргументов, заданных в прототипе функции. В следующей программе создается перегруженная функция number() класса absolute value, которая возвращает абсолютное значение как целочисленных аргументов, так и аргументов с плавающей запятой. В первом случае для этого используется библиотечная функция abs(),принимающая аргумент типа int, во втором - fabs ( ) , принимающая аргумент типа double. absolute. cpp Эта программа на языке C++ демонстрирует использование перегруженных функций-членов класса. Программа вычисляет абсолютное значение чисел типа int и double. #include <iostream.h> #include <math.h> содержит прототипы функций abs() и fabs() class absolute value { public: int number (int); double number (double) ; int absolute value::number(int test data) return(abs(test data)); double absolute value::number(double test data) return(fabs(test data)); } main() absolute value neg number; cout<< Абсолютное значение числа -583 равно << neg number.number(-583) << endl; cout<< Абсолютное значение числа -583.1749 равно << neg number. number (-583.1749)<< endl; return (0); ) Вот какими будут результаты работы программы: Абсолютное значение числа -583 равно 583 Абсолютное значение числа -583.1749 равно 583.175 В приводимой далее программе в функцию trig calc() передается значение угла в одном из двух форматов: числовом или строковом. Программа вычисляет синус, косинус и тангенс угла. overload. срр Эта программа на языке C++ содержит пример перегруженной функции, принимающей значение угла как в числовом виде, так и в формате градусы/минуты/секунды. #include <iostream.h> #include <math.h> #include <string.h> const double DEG TO RAD = 0.0174532925; class trigonometric { double angle; public: void trig calc(double); void trig calc(char *); }; void trigonometric::trig calc(double degrees) ! angle = degrees; cout << \пДля угла << angle << градусов: << endl; cout << синус равен << sin (angle * DEG TO RAD) << endl; cout << косинус равен << cos(angle * DEG TO RAD) << endl; cout << тангенс равен << tan(angle * DEG TO RAD) << endl; } void trigonometric::trig calc(char *dat) ( char *deg, *min, *sec; deg = strtok(dat, d ); min = strtok(0, m ); sec = strtok(0, s ); angle = atof(deg) + atof(min)/60.0 + atof (sec)/360.0; cout<< \пДля угла . << angle << градусов: << endl; cout << синус равен << sin(angle * DEG TO RAD) << endl; cout << косинус равен << cos(angle * DEG TO RAD) << endl; cout << тангенс равен << tan (angle * DEG TO RAD) << endl; } main () ( trigonometric data; data.trig calc(75.0) ; char str1[] = 35d 75m 20s ; data.trig calc(str1) ; data.trig calc(145.72); char str2[l= 65d45m 30s ; data.trig calc (str2) ; return(0); } В программе используется библиотечная функция strtok() , прототип которой находится в файле STRING.H. Эта функция сканирует строку, разбивая ее на лексемы, признаком конца которых служит один из символов, перечисленных во втором аргументе. Длина каждой лексемы может быть произвольной. Функция возвращает указатель на первую обнаруженную лексему. Лексемы можно читать одну за другой путем последовательного вызова функции strtok( ) . Дело в том, что после каждой лексемы она вставляет в строку символ \0 вместо символа-разделителя. Если при следующем вызове в качестве первого аргумента указать 0, функция продолжит чтение строки с этого места. Когда в строке больше нет лексем, возвращается нулевой указатель. Рассмотренная программа позволяет задавать значение угла в виде строки с указанием градусов, минут и секунд. Признаком конца первой лексемы, содержащей количество градусов, служит буква d, второй лексемы - т, третьей - s. Каждая извлеченная лексема преобразуется в число с помощью стандартной библиотечной функции atof() из файла МАТН.Н. Ниже представлены результаты работы программы: Для угла 75 градусов: синус равен 0.965926 косинус равен 0.258819 тангенс равен 3.73205 Для угла 36.3056 градусов: синус равен 0.592091 косинус равен 0.805871 тангенс равен 0.734722 Для угла 145.72 градусов: синус равен 0.563238 косинус равен -0.826295 тангенс равен -0.681642 Для угла 65.8333 градусов: синус равен 0.912358 косинус равен 0.409392 тангенс равен 2.22857 Дружественные функции Переменные-члены классов, как правило, являются закрытыми, и доступ к ним можно получить только посредством функций-членов своего же класса. Может показаться странным, но существует категория функций, создаваемых специально для того, чтобы преодолеть это ограничение. Эти функции, называемые дружественными и объявляемые в описании класса с помощью ключевого слова friend, получают доступ к переменным-членам класса, сами не будучи его членами. friend.cpp Эта программа на языке C++ демонстрирует использование дружественных функций. Программа получает от системы информацию о текущей дате и времени и вгчисляет количество секунд, прошедших после полуночи. #include <iostream.h> #include <time.h> содержит прототипы функций time(),localtime(), asctime(), а также описания структур tm и time t class time class { long sees; friend long present time(time class); дружественная функция public: time class(tm *); time class::time class(tm *timer) { secs = timer->tm hour*3600 + timer->tm min*60 + timer->tm sec; } long present time(time class); прототип main() получение данных о дате и времени от системы
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |