- Lektsia - бесплатные рефераты, доклады, курсовые работы, контрольные и дипломы для студентов - https://lektsia.info -

Эта программа генерирует следующие результаты.



Структуры до присваивания.

Svar1: 10 10

Svar2: 20 20

Структуры после присваивания,

Svar1: 10 10

Svar2: 10 10

В C++ каждое новое объявление структуры определяет новый тип. Следовательно, даже если две структуры физически одинаковы, но имеют разные имена типов, компилятор будет считать их разными и не позволит присвоить значение одной из них другой. Рассмотрим следующий фрагмент кода. Он некорректен и поэтому не скомпилируется.

struct stype1 {

 int a, b;

};

struct stype2 {

 int a, b;

};

stype1 svar1;

stype2 svar2;

svar2 = svar1; // Ошибка из-за несоответствия типов.

Несмотря на то что структуры stype1 и stype2 физически одинаковы, с точки зрения компилятора они являются отдельными типами.

Узелок на память. Одну структуру можно присвоить другой только в том случае, если обе они имеют одинаковый тип.

Использование указателей на структуры и оператора "стрелка"

В C++ указатели на структуры можно использовать таким же способом, как и указатели на переменные любого другого типа. Однако использование указателей на структуры имеет ряд особенностей, которые необходимо учитывать.

Указатель на структуру объявляется так же, как указатель на любую другую переменную, т.е. с помощью символа "*", поставленного перед именем структурной переменной. Например, используя определенную выше структуру inv_type, можно записать следующую инструкцию, которая объявляет переменную inv_pointer указателем на данные типа inv_type:

inv_type *inv_pointer;

Чтобы найти адрес структурной переменной, необходимо перед ее именем разместить оператор "&". Например, предположим, с помощью следующего кода мы определяем структуру, объявляем структурную переменную и указатель на структуру определенного нами типа.

struct bal {

 float balance;

 char name[80];

}

person;

bal *p; // Объявляем указатель на структуру.

Тогда при выполнении инструкции

р = &person;

в указатель р будет помещен адрес структурной переменной person.

К членам структуры можно получить доступ с помощью указателя на эту структуру. Но в этом случае используется не оператор "точка", а оператор "->". Например, при выполнении этой инструкции мы получаем доступ к полю balance через указатель р:

p->balance

Оператор "->" называется оператором "стрелка". Он образуется с использованием знаков "минус" и "больше".

Оператор "стрелка" (->) позволяет получить доступ к членам структуры с помощью указателя.

Указатель на структуру можно использовать в качестве параметра функции. Важно помнить о таком способе передачи параметров, поскольку он работает гораздо быстрее, чем в случае, когда функции "собственной персоной" передается объемная структура. (Передача указателя всегда происходит быстрее, чем передача самой структуры.)

Узелок на память. Чтобы получить доступ к членам структуры, используйте оператор "точка". Чтобы получить доступ к членам структуры с помощью указателя, используйте оператор "стрелка".

Пример использования указателей на структуры

В качестве интересного примера использования указателей на структуры можно рассмотреть С++-функции времени и даты. Эти функции считывают значения текущего системного времени и даты. Для их использования в программу необходимо включить заголовок <ctime>. Этот заголовок поддерживает два типа даты, требуемые упомянутыми функциями. Один из этих типов, time_t, предназначен для представления системного времени и даты в виде длинного целочисленного значения, которое используется в качестве календарного времени. Второй тип представляет собой структуру tm, которая содержит отдельные элементы даты и времени. Такое представление времени называют поэлементным. Структура tm имеет следующий формат.

struct tm {

 int tm_sec; /* секунды, 0-59 */

 int tm_min; /* минуты, 0-59 */

 int tm_hour; /* часы, 0-23 */

 int tm_mday; /* день месяца, 1-31 */

 int tm_mon; /* месяц, начиная с января, 0-11 */

 int tm_year; /* год после 1900 */

 int tm_wday; /* день, начиная с воскресенья, 0-6 */

 int tm_yday; /* день, начиная с 1-го января, 0-365 */

 int tm_isdst /* индикатор летнего времени */

}

Значение tm_isdst положительно, если действует режим летнего времени (Daylight Saving Time), равно нулю, если не действует, и отрицательно, если информация об этом недоступна.

Основным средством определения времени и даты в C++ является функция time(), которая имеет такой прототип:

time_t time(time_t *curtime);

Функция time() возвращает текущее календарное время системы. Если в системе отсчет времени не производится, возвращается значение -1. Функцию time() можно вызывать либо с нулевым указателем, либо с указателем на переменную curtime типа time_t. В последнем случае этой переменной будет присвоено значение текущего календарного времени.

Чтобы преобразовать календарное время в поэлементное, используйте функцию localtime(), которая имеет такой прототип:

struct tm *localtime(const time_t *curtime);

Функция localtime() возвращает указатель на поэлементную форму параметра curtime, представленного в виде структуры tm. Значение curtime представляет локальное время. Его обычно получают с помощью функции time().

Структура, используемая функцией localtime() для хранения времени в поэлементной форме, размещается в памяти статически и перезаписывается при каждом вызове этой функции. Если нужно сохранить содержимое этой структуры, скопируйте его в какую-нибудь другую область памяти.

Следующая программа демонстрирует использование функций time() и localtime(), отображая на экране текущее системное время.

// Эта программа отображает текущее системное время.

#include <iostream>

#include <ctime>

using namespace std;

Int main()

{

 struct tm *ptr;

 time_t lt;

 lt = time('0');

 ptr = localtime(&lt);

 cout << ptr->tm_hour << ':' << ptr->tm_min;

 cout << ':' << ptr->tm_sec;

 return 0;

}

Вот один из возможных результатов выполнения этой программы:

14:52:30

Несмотря на то что ваши программы могут использовать поэлементную форму представления времени и даты (как показано в предыдущем примере), проще всего сгенерировать строку времени и даты с помощью функции asctime(), прототип который выглядит так:

char *asctime(const struct tm *ptr);

Функция asctime() возвращает указатель на строку, которая содержит результат преобразования информации, хранимой в адресуемой параметром ptr структуре, и имеет следующую форму.

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

Указатель на структуру, передаваемый функции asctime(), часто получают с помощью функции localtime().

Область памяти, используемая функцией asctime() для хранения форматированной строки результата, представляет собой символьный массив (статически выделяемый в памяти), который перезаписывается при каждом вызове этой функции. Если нужно сохранить содержимое данной строки, скопируйте его в какую-нибудь другую область памяти.

В следующей программе демонстрируется использование функции asctime() для отображения системного времени и даты.

// Эта программа отображает текущее системное время.

#include <iostream>

#include <ctime>

using namespace std;

Int main()

{

 struct tm *ptr;

 time_t lt;

 lt = time('0');

 ptr = localtime(&lt);

 cout << asctime(ptr);

 return 0;

}

Вот один из возможных результатов выполнения этой программы.

Wed Jul 28 15:05:51 2004

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

Ссылки на структуры

Для доступа к структуре можно использовать ссылку. Ссылка на структуру часто используется в качестве параметра функции или значения, возвращаемого функцией. При получении доступа к членам структуры с помощью ссылки используйте оператор "точка". (Оператор "стрелка" зарезервирован для доступа к членам структуры с помощью указателя.)

В следующей программе показано, как можно использовать структуру при передаче функции параметров по ссылке.

// Демонстрируем использование ссылки на структуру.

#include <iostream>

using namespace std;

struct mystruct {

 int a; int b;

};

mystruct &f(mystruct &var);

Int main()

{

 mystruct x, y;

 x.a = 10; x.b = 20;

 cout << "Исходные значения полей x.a and x.b: ";

 cout << x.a << ' ' << x.b << '';

 y = f (x);

 cout << "Модифицированные значения полей x.a и x.b: ";

 cout << x.a << ' ' << x.b << '';

 cout << "Модифицированные значения полей y.a и y.b: ";

 cout << y.a << ' ' << y.b << '';

 return 0;

}

// Функция, которая получает и возвращает ссылку на структуру.

mystruct &f(mystruct &var)

{

 var.a = var.a * var.a;

 var.b = var.b / var.b;

 return var;

}