Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Эта программа генерирует следующие результаты.
Структуры до присваивания. 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; } Популярное:
|
Последнее изменение этой страницы: 2016-03-17; Просмотров: 1225; Нарушение авторского права страницы