Главная » Просмотр файлов » С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс

С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944), страница 75

Файл №1114944 С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс) 75 страницаС.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944) страница 752019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 75)

Эта трансформациязаключается в добавлении спецификатора const к адресуемому типу, поэтому относитсяк категории преобразований спецификаторов. Несмотря на то, что функция ожидаетполучить два указателя на const int, а фактические аргументы являются указателямина int, считается, что точное соответствие между формальными и фактическимипараметрами функции is_equal() установлено.Преобразование спецификаторов применимо только к типу, который адресует указатель.Оно не употребляется в случае, когда формальный параметр имеет спецификатор constextern void takeCI( const int );int main() {int ii = ...;takeCI(ii);return 0;// преобразование спецификаторов не применяетсяили volatile, а фактический аргумент – нет.}Хотя формальный параметр функции takeCI() имеет тип const int, а вызывается онас аргументом ii типа int, преобразование спецификаторов не производится: есть точноесоответствие между фактическим аргументом и формальным параметром.Все сказанное верно и для случая, когда аргумент является указателем, а спецификаторыextern void init( int *const );extern int *pi;int main() {// ...init(pi);return 0;// преобразование спецификаторов не применяетсяconst или volatile относятся к этому указателю:}Спецификатор const при формальном параметре функции init() относится к самомууказателю, а не к типу, который он адресует.

Поэтому компилятор при анализепреобразований, которые должны быть применены к фактическому аргументу, неучитывает этот спецификатор. К аргументу pi не применяется преобразованиеспецификатора: считается, что этот аргумент и формальный параметр точносоответствуют друг другу.Первые три из рассмотренных преобразований (l-значения в r-значение, массива вуказатель и функции в указатель) часто называют трансформациями l-значений.

(Вразделе 9.4 мы увидим, что хотя и трансформации l-значений, и преобразованияспецификаторов относятся к категории преобразований, не нарушающих точногосоответствия, его степень считается выше в случае, когда необходима лишь перваятрансформация. В следующем разделе мы поговорим об этом несколько подробнее.)Точное соответствие можно установить принудительно, воспользовавшись явнымприведением типов. Например, если есть две перегруженные функции:С++ для начинающих444extern void ff(int);extern void ff(void *);то вызовff( 0xffbc );// вызывается ff(int)будет точно соответствовать ff(int), хотя литерал 0xffbc записан в видешестнадцатеричной константы.

Программист может заставить компилятор вызватьфункцию ff(void *), если явно выполнит операцию приведения типа:ff( reinterpret_cast<void *>(0xffbc) );// вызывается ff(void*)Если к фактическому аргументу применяется такое приведение, то он приобретает тип, вкоторый преобразуется. Явные приведения типов помогают в управлении процессомразрешения перегрузки. Например, если при разрешении перегрузки получаетсянеоднозначный результат (фактические аргументы одинаково хорошо соответствуютдвум или более устоявшим функциям), то для устранения неоднозначности можноприменить явное приведение типа, заставив компилятор выбрать конкретную функцию.9.3.2.

Подробнее о расширении типовПод расширением типа понимается одно из следующих преобразований:••••фактический аргумент типа 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' );return 0;// тип char расширяется до intсоответствующему расширенному типу:}Символьный литерал имеет тип 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 расширяется до типа intff( Pass );// ff( int )ff( 0 );// ff( int )типа:}Иногда расширение перечислений преподносит сюрпризы. Компиляторы часто выбираютпредставление перечисления в зависимости от значений его элементов. Предположим,что в вышеупомянутой архитектуре (один байт для char и четыре байта для int)определено такое перечисление:enum e1 { a1, b1, c1 };Поскольку есть всего три элемента: a1, b1 и c1 со значениями 0, 1 и 2 соответственно – ипоскольку все эти значения можно представить типом char, то компилятор, как правило,и выбирает char для представления типа e1.

Рассмотрим, однако, перечисление e2 соследующим множеством элементов:enum e2 { a2, b2, c2=0x80000000 };Так как одна из констант имеет значение 0x80000000, то компилятор обязан выбрать дляпредставления e2 такой тип, который достаточен для хранения значения 0x80000000, тоесть unsigned int.Итак, хотя и e1, и e2 являются перечислениями, их представления различаются. Из-заэтого e1 и e2 расширяются до разных типов:445С++ для начинающих446#include <string>string format( int );string format( unsigned int );int main() {format(a1);format(a2);return 0;// вызывается format( int )// вызывается format( unsigned int )}При первом обращении к format() фактический аргумент расширяется до типа int, таккак для представления типа e1 используется char, и, следовательно, вызываетсяперегруженная функция format(int).

При втором обращении тип фактическогоаргумента e2 представлен типом unsigned int и аргумент расширяется до unsignedint, из-за чего вызывается перегруженная функция format(unsigned int). Поэтомуследует помнить, что поведение двух перечислений по отношению к процессу разрешенияперегрузки может быть различным и зависеть от значений элементов, определяющих, какпроисходит расширение типа.9.3.3. Подробнее о стандартном преобразованииИмеется пять видов стандартных преобразований, а именно:1.

преобразования целых типов: приведение от целого типа или перечисления к любомудругому целому типу (исключая трансформации, которые выше были отнесены ккатегории расширения типов);2. преобразования типов с плавающей точкой: приведение от любого типа с плавающейточкой к любому другому типу с плавающей точкой (исключая трансформации,которые выше были отнесены к категории расширения типов);3. преобразования между целым типом и типом с плавающей точкой: приведение отлюбого типа с плавающей точкой к любому целому типу или наоборот;4. преобразования указателей: приведение целого значения 0 к типу указателя илитрансформация указателя любого типа в тип void*;5. преобразования в тип bool: приведение от любого целого типа, типа с плавающейточкой, перечислимого типа или указательного типа к типу bool.extern void print( void* );extern void print( double );int main() {int i;print( i );// соответствует print( double );// i подвергается стандартному преобразованию из int вdoubleprint( &i ); // соответствует print( void* );// &i подвергается стандартному преобразованию// из int* в void*return 0;Вот несколько примеров:С++ для начинающих447}Преобразования, относящиеся к группам 1, 2 и 3, потенциально опасны, так как целевойтип может и не обеспечивать представления всех значений исходного.

Например, спомощью float нельзя адекватно представить все значения типа int. Именно по этойпричине трансформации, входящие в эти группы, отнесены к категории стандартныхint i;void calc( float );int main() {calc( i );// стандартное преобразование между целым типом и типом с// плавающей точкой потенциально опасно в зависимости от// значения ireturn 0;преобразований, а не расширений типов.}При вызове функции calc() применяется стандартное преобразование из целого типаint в тип с плавающей точкой float. В зависимости от значения переменной i можетоказаться, что его нельзя сохранить в типе float без потери точности.Предполагается, что все стандартные изменения требуют одного объема работы.Например, преобразование из char в unsigned char не более приоритетно, чем из charв double.

Близость типов не принимается во внимание. Если две устоявших функциитребуют для установления соответствия стандартной трансформации фактическогоаргумента, то вызов считается неоднозначным и помечается компилятором как ошибка.extern void manip( long );Например, если даны две перегруженные функции:extern void manip( float );int main() {manip( 3.14 );// ошибка: неоднозначность// manip( float ) не лучше, чем manip( int )return 0;то следующий вызов неоднозначен:}Константа 3.14 имеет тип double.

С помощью того или иного стандартногопреобразования соответствие может быть установлено с любой из перегруженныхфункций. Поскольку есть две трансформации, приводящие к цели, вызов считаетсянеоднозначным. Ни одно преобразование не имеет преимущества над другим.Программист может разрешить неоднозначность либо путем явного приведения типа:manip ( static_cast<long>( 3.14 ) );// manip( long )либо используя суффикс, обозначающий, что константа принадлежит к типу float:С++ для начинающихmanip ( 3.14F ) );448// manip( float )Вот еще несколько примеров неоднозначных вызовов, которые помечаются как ошибки,extern void farith( unsigned int );extern void farith( float );int main() {// каждый из последующих вызововfarith( 'a' );// аргументfarith( 0 );// аргументfarith( 2uL );// аргументfarith( 3.14159 );// аргументfarith( true );// аргументнеоднозначенимеет тип charимеет тип intимеет тип unsigned longимеет тип doubleимеет тип boolпоскольку соответствуют нескольким перегруженным функциям:}Стандартные преобразования указателей иногда противоречат интуиции.

Характеристики

Тип файла
PDF-файл
Размер
5,41 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6374
Авторов
на СтудИзбе
309
Средний доход
с одного платного файла
Обучение Подробнее