Московский государственный университет имени М.В.Ломоносова
Опубликован: 01.11.2004 | Доступ: свободный | Студентов: 10669 / 350 | Оценка: 4.12 / 4.01 | Длительность: 19:18:00
ISBN: 978-5-9556-0077-9
Специальности: Программист
Лекция 6:

Простые типы данных

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

Преобразование типов в языке C++

Язык C++ позволяет выполнять преобразование значения одного типа в значение другого типа. Преобразование типа может быть явным и неявным. Явное преобразование называется приведением типов.

Для явного приведения типов можно использовать две формы записи:

  • без указания дополнительной информации для преобразования типа (перед преобразуемой переменной в скобках указывается имя типа, к которому она приводится).

    Например:

    std::cout <<"strlen="<<(long)strlen(pArr1);
  • с указанием дополнительной информации для преобразования типа (используются операторы static_cast, dynamic_cast, reinterpret_cast и const_cast ).

    Например:

    std::cout <<"strlen="<<static_cast<long>(
        strlen(pArr2));

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

Дополнительная информация о приводимом типе может быть указана следующими операторами:

  • static_cast - выполняет преобразование родственных типов;
  • const_cast - выполняет приведение константных выражений;
  • dynamic_cast - используется для динамического преобразования типа, реализуемого на этапе выполнения;
  • reinterpret_cast - выполняет преобразование не связанных между собой типов.

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

Типы данных языка Object Pascal

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

Типы данных языка Object Pascal можно разбить на следующие группы:

  • базовые типы данных:
    • целочисленный тип;
    • действительный тип;
    • логический тип;
    • символьный тип;
    • строковый тип;
  • производные типы данных ;
  • простые типы данных:
    • порядковый тип;
    • перечислимый тип;
  • структурированные типы данных:
    • множества;
    • массивы;
    • записи;
    • файлы;
    • объектный тип (тип класса);
    • тип ссылки на класс;
  • указатели ;
  • процедурный тип данных.

В язык Object Pascal включены следующие базовые типы данных:

  • Целочисленные типы

    Тип Диапазон значений Формат
    Integer -2147483648..2147483647 signed 32-bit
    Cardinal 0..4294967295 unsigned 32-bit
    Shortint -128..127 signed 8-bit
    Smallint -32768..32767 signed 16-bit
    Longint -2147483648..2147483647 signed 32-bit
    Int64 -263..263-1 signed 64-bit
    Byte 0..255 unsigned 8-bit
    Word 0..65535 unsigned 16-bit
    Longword 0..4294967295 unsigned 32-bit
  • Действительные типы

    Тип Диапазон значений Размер в байтах
    Real 5.0 * 10-324 .. 1.7 * 10308 8
    Real48 2.9 * 10-39 .. 1.7 * 1038 6
    Single 1.5 * 10-45 .. 3.4 * 1038 4
    Double 5.0 * 10-324 .. 1.7 * 10308 8
    Extended 3.6 * 10-4951 .. 1.1 * 104932 10
    Comp -263+1 .. 263 -1 8
    Currency -922337203685477.5808.. 922337203685477.5807 8

    Для указания значения действительного типа можно использовать экспоненциальный формат (например, значение 1.3Е-5 эквивалентно 1.3*10-5).

  • Логические типы

    Тип Диапазон значений Размер в байтах
    Boolean True или False 1
    ByteBool True или False 1
    WordBool True или False 2
    LongBool True или False 4
  • Символьные типы

    Тип Диапазон значений Размер в байтах
    Char ANSI-символ 1
    AnsiChar ANSI-символ 1
    WideChar Unicode-символ 2
  • Строковые типы

    Тип Максимальная длина Размер в байтах
    string Определяется директивой компилятора $H
    ShortString 255 символов От 2 до 256 байт
    AnsiString (длинная строка) ~231 символов От 4 байт до 2 Гбайт
    WideString (Символы Unicode) ~230 символов От 4 байт до 2 Гбайт

Для строковых переменных выполняются следующие правила:

  • строки могут быть постоянной или переменной длины: при объявлении строки можно указать только идентификатор или идентификатор и в квадратных скобках длину строки;
  • значение строки указывается в одинарных кавычках или как последовательность ASCII-символов, перед каждым из которых ставится знак # ;
  • доступ к символу строки можно выполнять по индексу, указываемому в квадратных скобках (например, MyString[7] := 'n'; ).

Например:

var 
S1: string; 
  {Объявление строковой переменной 
   произвольной длины}
S2: string[2]; 
  {Объявление строковой переменной 
   длиной 2 символа}

Строки типа AnsiString также называют длинными строками (long string), представляющими динамически размещаемые строки, длина которых ограничена только доступной памятью. Такие строки используют 1-байтовое представление ANSI-символов.

Реально переменная типа AnsiString является указателем, состоящим из 4 байт. Если строка пустая (ее длина равна 0), то указатель равен nil и для хранения строки никакой памяти не выделяется. Если строка не является пустой, то данная переменная указывает на динамически размещаемый блок памяти, содержащий значение строки, на 32-битовое значение длины строки и на 32 битовое значение счетчика ссылок на строку.

Несколько идентификаторов строк могут ссылаться на одну строку. При этом им не будет выделяться дополнительная память, а только будет выполняться увеличение счетчика ссылок.

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

Скажите, пожалуйста, если в терминологии объектно-ориентированного программирования функции также называются методами или методами - членами класса, в примере объявления указателя на метод использовали в формальном описании оба названия:

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Денис Комаров
Денис Комаров
Россия, Москва