Программирование >>  Процедурные приложения 

1 ... 76 77 78 [ 79 ] 80 81 82 ... 150


time t ltime; tm *ptr;

time(&ltime);

ptr = localtime(&ltime);

time class tz(ptr);

cout<< Текущие дата и время: << asctime(ptr) << endl; cout<< Число секунд, прошедших после полуночи: << present time(tz) << endl; return (0);

long present time (time class tz)

return(tz.secs);

Давайте подробнее рассмотрим процесс получения данных о дате и времени.

time t ltime; tm *ptr;

time (&ltime) ; ptr = localtime(&ltime) ;

Сначала создается переменная ltime типа time t, которая инициализируется значением, возвращаемым функцией time(). Эта функция вычисляет количество секунд, прошедших с даты 1-е января 1970 г. 00:00:00 по Гринвичу, в соответствии с показаниями системных часов. Тип данных time tспециально предназначен для хранения подобного рода значений. Он лучше всего подходит для выполнения такой операции, как сравнение дат, поскольку содержит, по сути, единственное число, которое легко сравнивать с другим аналогичным числом.

Далее создается указатель на структуру tm, предназначенную для хранения даты в понятном для человека виде:

structtm {

inttm sec; секунды (0-59) inttm min; минуты (0-59) inttm hour; часы (0-23) inttm mday; день месяца (1-31) inttm mon; номер месяца (0-11;январь =0) inttm year; год (текущий год минус 1900) inttm wday; номер дня недели (0-6; воскресенье =0) inttm yday; день года (0-3 65;1-е января = 0)

inttm isdst; положительное число, если осуществлен переход на летнее время;

0, если летнее время еще не введено;

отрицательное число, если информация о летнем времени отсутствует };

Функция localtime(), в качестве аргумента принимающая адрес значения типа time t, возвращает указатель на структуру tm, содержащую информацию о текущем времени в том часовом поясе, который установлен в системе. Имеется схожая с ней функция gmtime(), вычисляющая текущее время по Гринвичу.

Полученная структура передается объекту tzкласса time class, а точнее - конструктору этого класса, вызываемому в строке

time class tz(ptr);

В конструкторе из структуры tmизвлекаются поля tm sec, tm minи tm hour и по несложной формуле вычисляется количество секунд, прошедших после полуночи.

sees = timer->tm hour*3600 + timer->tm min*60 + timer->tm sec;

Функция asсtime() преобразует структуру tm в строку вида

день месяц число часы:минуты:секунды год\п\0 Например:

MonAug10 13:12:21 1998



Дружественная классу time classфункция present time() получает доступ к переменной secsэтого класса и возвращает ее в программу. Программа выводит на экран две строки следующего вида:

Текущие дата и время: MonAug10 09:31:141998 Число секунд, прошедших после полуночи: 34274

Указатель this

Ключевое слово this выступает в роли неявно заданного указателя на текущий объект: имя класса *this;

Указатель thisдоступен только в функциях-членах классов (а также структур) и позволяет сослаться на объект, для которого вызвана функция. Чаще всего он находит применение в конструкторах, выполняющих резервирование памяти:

class имякласса

public:

имя класса(int size) ( this = new(size); }

~имя класса (void) ; };

Перегрузка операторов

В C++ разрешается осуществлять перегрузку не только функций, но и операторов. В создаваемом классе можно изменить свойства большинства стандартных операторов, таких как +, -, * и /, заставив их работать не только с данными базовых типов, но также с объектами.

Концепция перегрузки операторов реализована в большинстве языков программирования, пусть и в неявном виде. Например, оператор суммирования + позволяет складывать как целочисленные значения, так и значения с плавающей запятой. Это и есть перегрузка, так как один и тот же оператор применяется для выполнения действий над данными разных типов.

Для перегрузки операторов применяется ключевое слово operator:

тип operator оператор ( список параметров)

В таблице 14.1 перечислены операторы, перегрузка которых допустима в C++.

Таблица 14.1. Операторы, которые могут быть перегружены

+ -

% -

! =

<

>

+= -=

= &=

<<

>> <<=

<= >=

&&

1 1

++ -

( ) []

delete

& 1

~ * =

>>= ==

->

->*

На перегрузку операторов накладываются следующие ограничения: невозможно изменить приоритет оператора и порядок группировки его операндов;

невозможно изменить синтаксис оператора: если, например, оператор унарный, т.е. принимает только один аргумент, то он не может стать бинарным;

перегруженный оператор является членом своего класса и, следовательно, может участвовать только в выражениях с объектами этого класса;

невозможно изменить смысл стандартного оператора применительно к базовым типам данных;

невозможно создавать новые операторы; запрещается переопределять такие операторы:

. .* :: ?:



Следующая программа наглядно иллюстрирует концепцию перегрузки операторов, осуществляя суммирование углов, заданных с помощью строк формата

градусыd минутыm секундыs

Выделение из строки значащих частей осуществляет уже знакомая нам функция strtok(). Признаками конца лексем служат буквы d, m и s.

angles.cpp

Эта программа на языке C++ содержит пример перегрузки оператора +.

#include <iostream.h> #include <string.h>

include <stdlib.h> функция atoi()

class angle value {

int degrees, minutes, seconds;

public:

angle value () { degrees =0, minutes =0,

seconds = 0; } стандартный конструктор angle value(char *); int get degrees () ; int get minutes(); int get seconds();

angle value operator +(angle value); перегруженный оператор

angle value::angle value(char *angle sum) {

выделение значащих частей строки и преобразование их в целые числа degrees = atoi(strtok(angle sum, d )); minutes = atoi(strtok(0, m )); seconds = atoi(strtok(0, s ));

int angle value::get degrees() return degrees; int angle value::get minutes0 return minutes;

int angle value::get seconds() return seconds; angle value angle value::

operator+(angle value angle sum) angle value ang;

ang.seconds = (seconds + angle sum.seconds) % 60; ang.minutes =

((seconds+ angle sum.seconds) / 60 +

minutes + angle sum.minutes) % 60; ang.degrees = ((seconds+

angle sum.seconds) / 60 +

minutes + angle sum.minutes) / 60;

ang.degrees += degrees + angle sum.degrees;

return ang;

main()

char str1[]= 37d15m 56s ; angle value angle1(str1);

char str2[]= lOd44m 44s ; angle value angle2(str2); char str3[]= 75d 17m 59s ;

angle value angles(str3);

char str4[]= 130d 32m 54s ;

angle value angle4(str4); angle value sum of angles;

sum of angles = angle1 + angle2 + angle3 + angle4;



1 ... 76 77 78 [ 79 ] 80 81 82 ... 150

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