Поделиться через


Система типов современные C++ (C++)

Понятие типа очень важно на C и C-++.Каждая переменная, аргумент функции и возвращаемое значение функции должны иметь тип быть компилированным.Кроме того, для каждого выражения (включая литеральные значения) неявно назначается тип компилятором до его вычисляется.Некоторые примеры типов включают int для хранения целые значения, double для хранения значения с плавающей запятой (также известные как скалярные типы данных ) или стандартный класс std::basic_string библиотеки для хранения текста.Можно создать собственный тип, указав class или struct.Тип определяет объем памяти, которая будет выбрана для переменной (или результата выражения), типы значений, которые могут храниться в этой переменной, их значения (как битовые шаблоны), и операции, выполняемые в ней.Этот раздел содержит неофициальный обзор основных функций системы типов C C-++.

Терминология

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

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

Тип POD (самый старый данные). Эта неофициальная C - к категории типов данных в относится к типам, скалярные (см. раздел тела типов) или классы POD.Класс POD не содержит статические члены данных, не существует стручков и отсутствуют определяемые пользователем конструкторы, определяемых пользователем деструктор, или определяемые пользователем операторы присваивания.Также класс POD не имеет виртуальные функции, не базовый класс и не закрытым или защищенным, статические члены данных.Типы POD часто используются для обмена внешних данных, например с, модуль в язык C (с типы POD только).

Определение типов переменных и функций

C и C-++ строго типизированным языком также статическ- набора; каждый объект имеет тип и этот тип никогда не изменяет (не путать с объектами статических данных).
При объявлении переменной в коде, необходимо указать его тип или явно, или используйте ключевое слово auto, чтобы указать компилятору вывести тип из инициализатора.
При объявлении функции в коде, необходимо определить тип каждого аргумента и своего возвращаемого значения, или значение void, если значение не возвращается функцией.Исключение при использовании шаблонов функции, которые позволяют для аргументов произвольных типов.

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

При объявлении переменной типа POD мы настоятельно рекомендуется, инициализируем его, что означает сделать его начальное значение.До тех пор, пока не будет инициализировать переменную, его" значение "сборщиком мусора, который включает все биты выполнялись находиться в этом расположении в памяти ранее.Это важное правило C, C-++, необходимо помнить, особенно при приходите из другого языка, который обрабатывает инициализация автоматически.При объявлении переменной типа класса, конструктор POD не обрабатывает инициализацию.

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

    int result = 0;              // Declare and initialize an integer.
    double coefficient = 10.8;   // Declare and initialize a floating 
                                 // point value.
    auto name = "Lady G.";       // Declare a variable and let compiler 
                                 // deduce the type.
    auto address;                // error. Compiler cannot deduce a type 
                                 // without an intializing value.
    age = 12;                    // error. Variable declaration must
                                 // specify a type or use auto!
    result = "Kenny G.";         // error. Can’t assign text to an int.
    string result = "zero";      // error. Can’t redefine a variable with
                                 // new type.
    int maxValue;                // Not recommended! maxValue contains 
                                 // garbage bits until it is initialized.

Основные (встроенные типы)

В отличие от некоторых языков C, C-++ не имеет универсальный базовый тип, от которого наследуются все другие типы.Реализация языка Visual C++ включает несколько основных типов, также известных как встроенные типы.Это включает числовые типы, такие как int, double, long, bool, а также типы char и wchar_t для ASCII и символов юникода, соответственно.Большинство основные типы (за исключением bool, double, wchar_t и связанных типов) удалить все версии, которые изменяют диапазон значений, которые можно хранить в переменной.Например, int, в котором хранятся 32 бит знаковое целое число, которое может быть представлено значением от -2.147.483.648 до 2.147.483.647.unsigned int, который также хранится в виде 32 бита, может хранить значения от 0 до 4.294.967.295.Общее количество возможных значений в каждом случае одинакова; только другой диапазон.

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

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

Размер встроенных типов в байтах

В следующей таблице перечислены наиболее часто используемые основные типы:

Тип

Размер

Комментарий

Целочисленное значение.

4 байта

Параметр по умолчанию для целых значений.

double

8 байтов

Параметр по умолчанию для значений с плавающей запятой.

bool

1 байт

Представляет значения, которые могут быть или true или false.

char

1 байт

Используйте для символов ASCII в старых строк в стиле или std::string объектах, которые никогда не будет преобразовать в ЮНИКОДАУ.

wchar_t

2 байта

Представляет "имеет" символы, которые могут быть представлены в формате Юникод (UTF-16 на других операционных системах Windows, может отличаться).Это внешний вид шрифта, используемого в строках типа std::wstring.

unsigned char

1 байт

C C-++ не имеет встроенный тип byte.Используйте unsigned char для представления байтовое значение.

unsigned int

4 байта

Не выполняйте вариант по умолчанию для флажков битов.

длина текста

8 байтов

Представляет очень большие целочисленные значения.

Пустой тип

Тип void представляет собой особый тип; нельзя объявить переменную типа void, но можно объявить переменную типа void * (указатель на void), которые иногда требуется отменить выбор сырцовая (типизированная память).Однако указатели на void не является типобезопасной и обычно их использования строго обескуражено в современном C C-++.В объявлении функции, возвращаемое значение void означает, что функция не возвращает значение. это общее и приемлемое использовать void.Пока C - язык требовал функций с нуля параметры для объявления void в списке, например fou(void), это обескуражена в современном C и C-++ должна быть объявлены fou().Для получения дополнительной информации см. Преобразования типов и безопасность типов (самомоднейшее C++).

квалификатор типа const

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

    const double PI = 3.1415;
    PI = .75 //Error. Cannot modify const variable.

Квалификатор const широко используется в функции и объявления переменных и правильности "const" важным принципом в C, C-++ по существу означает использовать const, чтобы гарантировать, во время компиляции, что значения не изменяются непреднамеренно.Для получения дополнительной информации см. const (C++).

Тип const определен из его версии, не являющимся константными; например, const int указанного типа из int.Можно использовать оператор const_cast C C-++ в тех редких случаях, когда необходимо удалить Const- мыс из переменной.Для получения дополнительной информации см. Преобразования типов и безопасность типов (самомоднейшее C++).

Строковые типы

Строго говоря, язык C C-++ не имеет встроенный тип "строки"; char и отдельных символов хранения wchar_t – необходимо объявить массив этих типов, чтобы приблизиться строка, а конечное значение NULL (например, ASCII ‘\0’) к элементу массива одному за последним знаком (также называемых допустимым в стиле "string").Необходимо соблюдать в стиле, что значительно больше кода был записан или использовать внешних функций общего назначения библиотеки строки.Но в современном C, C-++, следует типы std::string (для 8 разрядных символьных строк типа char) или std::wstring (для библиотеки стандарта 16 разрядных символьных строк типа wchar_t).Эти контейнеры STL можно рассматривать как собственных типов строк, поскольку они являются частью стандартных библиотек, которые включены в любой совместимой среде построения C C-++.Просто используйте директиву #include <string>, чтобы сделать эти типы доступной в программе.(Если используется MFC и библиотеки ATL, класс CString также доступен, но не является частью стандарта C-++ C). Использование объединения завершенных массивов символов (вышеуказанных строк в стиле языка C-) настоятельно обескуражено в современном C C-++.Дополнительные сведения о том, как решить, строковый тип, используемый в текущей программе C и C-++, преобразование между типами см. в разделе Строки и самомоднейшее текст (C++).

Пользовательские типы

При задании значения class, struct, union или enum, которые используют конструкции в остальной части кода, как если бы он был основным типом.Он содержит известного размера в памяти, а некоторые правила о том, как его можно использовать применяются к ней во время компиляции и проверки, во время выполнения, во время выполнения программы.Основные различия между основными встроенными типами и пользовательскими типами следующим образом:

  • Компилятор не имеет встроенную статью пользовательского типа.Он "сведения" типа при первоначальном определении встречает в процессе компиляции.

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

  • Они не должны быть определены статически (правило, тип объекта не изменяет).Механизмы через наследование и полиморфизм, переменная была объявлена как пользовательский тип класса (называется экземпляр объекта класса) может иметь различные типы во время выполнения, чем во время компиляции.Для получения дополнительной информации см. Производные классы.

Типы указателей

Датирующ обратно к предыдущим версиям, язык C, C-++ C продолжается, необходимо объявить переменную типа указателя с помощью специального декларатора * (звездочка).Тип указателя хранит адрес расположения в памяти, в которой хранится конкретного значения.В современном C, C-++, они называются необработанные указатели, и доступны в коде через специальные операторы * (звездочка) или -> (с дефиса " больше чем ").Это называется разыменования, то используется разыменуете зависит от того, будет ли указатель на скаляру или указателя на член в объекте.Работа с типами указателя текста является одним из наиболее трудные и набор аспектов разработки программы C C и C-++.В этом разделе которых некоторые факты и правила для использования необработанные указатели по своему усмотрению, но в современном C C-++ больше не требуется, чтобы (или не рекомендует) использует необработанные указатели для владения объекта на всех, медленным из-за дополнительного развитию интеллектуального указателя (которые более в конце данного раздела).Будет полезно и безопасно использовать необработанные указатели для отслеживания объектами, но если необходимо использовать их для владения объекта, необходимо сделать ее с осторожностью и очень тщательное рассмотрение, как создаются и уничтожаются объекты, принадлежащие ними.

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

    int* pNumber;       // Declare a pointer-to-int variable.
    *pNumber = 10;      // error. Although this may compile, it is
                        // a serious error. We are dereferencing an
                        // uninitialized pointer variable with no
                        // allocated memory to point to.

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

    int number = 10;          // Declare and initialize a local integer
                              // variable for data backing store.
    int* pNumber = &number;   // Declare and initialize a local integer
                              // pointer variable to a valid memory
                              // address to that backing store.
...
    *pNumber = 41;            // Dereference and store a new value in 
                              // the memory pointed to by
                              // pNumber, the integer variable called
                              // “number”. Note “number” was changed, not
                              // “pNumber”.

Исправлен пример кода использует локальной памяти стека для создания резервного хранилища, параметр pNumber указывает на.Мы используем базовый тип для простоты.На практике резервное хранилище для указателей, чаще всего пользовательские типы, динамически выбранные в области памяти с кучей (или "время" хранилищем) выражения с помощью ключевого слова new (в C-# стиле программирования, устаревшей функции библиотеки времени выполнения C malloc() использовался).После выбора, эти "переменные" обычно называются "объекты", особенно если они основаны на определении класса.Объем памяти, выделенной с new должна быть удалена соответствующий выпиской delete (или, при использовании функции malloc(), чтобы выбрать ее, функцией среды выполнения C free()-).

Однако легко забыть удаление динамически выбранный предмет особенно в сложном коде, который вызывает ошибку с именем ресурса утечкой памяти.По этой причине настоятельно обескуражено использовать необработанные указателей в современном C C-++.Почти всегда лучше создать необработанный указатель в интеллектуального указателя, которая автоматически освобождает память при его деструктор вызывается (при выполнении кода выходит за пределы области действия для интеллектуального указателя); с помощью интеллектуального указателя, практически исключении весь класс ошибок в программах C C-++.В следующем примере, предположим MyClass пользовательский тип, который имеет открытый метод DoSomeWork();

void someFunction() {
    unique_ptr<MyClass> pMc(new MyClass);
    pMc->DoSomeWork();
}
  // No memory leak. Out-of-scope automatically calls the destructor
  // for the unique_ptr, freeing the resource.

Дополнительные сведения о интеллектуального указателя см. в разделе Интеллектуальные указатели (самомоднейшее C++).

Дополнительные сведения о преобразовании указателя см. в разделе Преобразования типов и безопасность типов (самомоднейшее C++).

Дополнительные сведения о указателей в целом см. в разделе Указатели.

Типы данных Windows

В классическом Win32 для программирования C C и C-++, большинство функций используют typedef Windows- параметрами и макросы #define (определенные в windef.h) для определения типов параметров и возвращаемых значений.Эти типы данных "Windows" основной только специальные использовать имена (псевдонимы), присвоенное встроенные типы C C И C-++.Полный список этих typedef и определений препроцессора см. в разделе Windows Data Types.Некоторые из этих typedef, например HRESULT и код языка, позволяют и описательны.Другие, например INT, не имеет особого смысла и просто псевдонимы для основных типов C C-++.Другие типы данных Windows имеют имена, которые содержатся в дней программирования C и разрядных 16 процессоров, и не связанные с целью или вызвать современные оборудовании или операционных системах.Также специальные типы данных, связанные с библиотеки среды выполнения Windows, перечисленная как Windows Runtime base data types.В современном C, C-++, общая рекомендация предпочтительным типы C C-++ основные, если тип Windows не будет взаимодействовать некоторые дополнительные значение о том, как интерпретировать значение.

Дополнительные сведения

Дополнительные сведения о системе типов C, C-++, см. в следующих разделах.

Типы значений (самомоднейшее C++)

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

Преобразования типов и безопасность типов (самомоднейшее C++)

Описывает общие проблемы преобразования типов и показывает, как их избежать.

См. также

Другие ресурсы

Добро пожаловать в C++ (современные C++)

Справочник по языку C++

Справочник по стандартной библиотеки C++