С++ для начинающих




Подробнее о расширении типов


Под расширением типа понимается одно из следующих преобразований:

  • фактический аргумент типа char, unsigned char или short расширяется до типа int. Фактический аргумент типа unsigned short расширяется до типа int, если машинный размер int больше, чем размер short, и до типа unsigned int в противном случае;
  • аргумент типа float расширяется до типа double;
  • аргумент перечислимого типа расширяется до первого из следующих типов, который способен представить все значения элементов перечисления: int, unsigned int, long, unsigned long;
  • аргумент типа bool расширяется до типа int.
  • Подобное расширение применяется, когда тип фактического аргумента совпадает с одним из только что перечисленных типов, а формальный параметр относится к соответствующему расширенному типу:

    extern void manip( int );

    int main() {

       manip( 'a' );    // тип char расширяется до int

       return 0;

    }

    Символьный литерал имеет тип char. Он расширяется до int. Поскольку расширенный тип соответствует типу формального параметра функции manip(), мы говорим, что ее вызов требует расширения типа аргумента.

    Рассмотрим следующий пример:

    extern void print( unsigned int );

    extern void print( int );

    extern void print( char );

    unsigned char uc;

    print( uc );   // print( int ); для uc требуется только расширение типа

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

    Следующий пример иллюстрирует расширение фактического аргумента перечислимого типа:

    enum Stat ( Fail, Pass );

    extern void ff( int );

    extern void ff( char );

    int main() {

       // правильно: элемент перечисления Pass расширяется до типа int




    Содержание  Назад  Вперед