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

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

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

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

Есть ли среди них ошибочные?(c) const int *pic;Упражнение 3.17(a)(b)(c)(d)int i = -1;const int ic = i;const int *pic = ⁣int *const cpi = ⁣Какие из приведенных определений правильны? Почему?(e) const int *const cpic = ⁣Упражнение 3.18Используя определения из предыдущего упражнения, укажите правильные операторы(a) i = ic;(b) pic = ⁣(d) pic = cpic;(i) cpic = ⁣присваивания. Объясните.(c) cpi = pic;(f) ic = *cpic;С++ для начинающих3.6. Ссылочный типСсылочный тип, иногда называемый псевдонимом, служит для задания объектудополнительного имени. Ссылка позволяет косвенно манипулировать объектом, точнотак же, как это делается с помощью указателя.

Однако эта косвенная манипуляция нетребует специального синтаксиса, необходимого для указателей. Обычно ссылкиупотребляются как формальные параметры функций. В этом разделе мы рассмотримсамостоятельное использование объектов ссылочного типа.Ссылочный тип обозначается указанием оператора взятия адреса (&) перед именемint ival = 1024;// правильно: refVal - ссылка на ivalint &refVal = ival;// ошибка: ссылка должна быть инициализированапеременной. Ссылка должна быть инициализирована.

Например:int &refVal2;Хотя, как мы говорили, ссылка очень похожа на указатель, она должна бытьинициализирована не адресом объекта, а его значением. Таким объектом может быть иint ival = 1024;// ошибка: refVal имеет тип int, а не int*int &refVal = &ival;int *pi = &ival;// правильно: ptrVal - ссылка на указательуказатель:int *&ptrVal2 = pi;Определив ссылку, вы уже не сможете изменить ее так, чтобы работать с другимобъектом (именно поэтому ссылка должна быть инициализирована в месте своегоопределения). В следующем примере оператор присваивания не меняет значения refVal,int min_val = 0;// ival получает значение min_val,// а не refVal меняет значение на min_valновое значение присваивается переменной ival – ту, которую адресует refVal.refVal = min_val;Все операции со ссылками реально воздействуют на адресуемые ими объекты.

В томчисле и операция взятия адреса. Например:refVal += 2;103С++ для начинающихприбавляет 2 к ival – переменной, на которую ссылается refVal. Аналогичноint ii = refVal;присваивает ii текущее значение ival,int *pi = &refVal;инициализирует pi адресом ival.Если мы определяем ссылки в одной инструкции через запятую, перед каждым объектомтипа ссылки должен стоять амперсанд (&) – оператор взятия адреса (точно так же, как и// определено два объекта типа intint ival = 1024, ival2 = 2048;// определена одна ссылка и один объектint &rval = ival, rval2 = ival2;// определен один объект, один указатель и одна ссылкаint inal3 = 1024, *pi = ival3, &ri = ival3;// определены две ссылкидля указателей).

Например:int &rval3 = ival3, &rval4 = ival2;Константная ссылка может быть инициализирована объектом другого типа (если,конечно, существует возможность преобразования одного типа в другой), а такжеdouble dval = 3.14159;// верно только для константных ссылокconst int &ir = 1024;const int &ir2 = dval;безадресной величиной – такой, как литеральная константа. Например:const double &dr = dval + 1.0;Если бы мы не указали спецификатор const, все три определения ссылок вызвали быошибку компиляции. Однако, причина, по которой компилятор не пропускает такихопределений, неясна.

Попробуем разобраться.Для литералов это более или менее понятно: у нас не должно быть возможности косвеннопоменять значение литерала, используя указатели или ссылки. Что касается объектовдругого типа, то компилятор преобразует исходный объект в некоторыйdouble dval = 1024;вспомогательный. Например, если мы пишем:const int &ri = dval;то компилятор преобразует это примерно так:104С++ для начинающихint temp = dval;const int &ri = temp;Если бы мы могли присвоить новое значение ссылке ri, мы бы реально изменили неdval, а temp. Значение dval осталось бы тем же, что совершенно неочевидно дляпрограммиста. Поэтому компилятор запрещает такие действия, и единственнаявозможность проинициализировать ссылку объектом другого типа – объявить ее какconst.Вот еще один пример ссылки, который трудно понять с первого раза.

Мы хотимопределить ссылку на адрес константного объекта, но наш первый вариант вызываетconst int ival = 1024;// ошибка: нужна константная ссылкаошибку компиляции:int *&pi_ref = &ival;const int ival = 1024;// все равно ошибкаПопытка исправить дело добавлением спецификатора const тоже не проходит:const int *&pi_ref = &ival;В чем причина? Внимательно прочитав определение, мы увидим, что pi_ref являетсяссылкой на константный указатель на объект типа int. А нам нужен неконстантныйconst int ival = 1024;// правильноуказатель на константный объект, поэтому правильной будет следующая запись:int *const &piref = &ival;Между ссылкой и указателем существуют два основных отличия. Во-первых, ссылкаобязательно должна быть инициализирована в месте своего определения.

Во-вторых,всякое изменение ссылки преобразует не ее, а тот объект, на который она ссылается.Рассмотрим на примерах. Если мы пишем:int *pi = 0;мы инициализируем указатель pi нулевым значением, а это значит, что pi не указываетни на какой объект. В то же время записьconst int &ri = 0;означает примерно следующее:105С++ для начинающихint temp = 0;const int &ri = temp;int ival = 1024, ival2 = 2048;int *pi = &ival, *pi2 = &ival2;Что касается операции присваивания, то в следующем примере:pi = pi2;переменная ival, на которую указывает pi, остается неизменной, а pi получаетзначение адреса переменной ival2. И pi, и pi2 и теперь указывают на один и тот жеобъект ival2.int &ri = ival, &ri2 = ival2;Если же мы работаем со ссылками:ri = ri2;то само значение ival меняется, но ссылка ri по-прежнему адресует ival.В реальных С++ программах ссылки редко используются как самостоятельные объекты,// пример использования ссылок// Значение возвращается в параметре next_valuebool get_next_value( int &next_value );// перегруженный операторобычно они употребляются в качестве формальных параметров функций.

Например:Matrix operator+( const Matrix&, const Matrix& );int ival;Как соотносятся самостоятельные объекты-ссылки и ссылки-параметры? Если мы пишем:while (get_next_value( ival )) ...это равносильно следующему определению ссылки внутри функции:int &next_value = ival;(Подробнее использование ссылок в качестве формальных параметров функцийрассматривается в главе 7.)Упражнение 3.19106С++ для начинающих(a)(c)(e)(g)intintintintival = 1.01;&rval2 = ival;*pi = &ival;&rval5 = pi*;107(b)(d)(f)(h)intintintint&rval1 =&rval3 =&rval4 =&*prval11.01;&ival;pi;= pi;Есть ли ошибки в данных определениях? Поясните.

Как бы вы их исправили?(i) const int &ival2 = 1;(j) const int &*prval2 = &ival;Упражнение 3.20Если ли среди нижеследующих операций присваивания ошибочные (используются(a) rval1 = 3.14159;(b) prval1 = prval2;(c) prval2 = rval1;определения из предыдущего упражнения)?(d) *prval2 = ival2;Упражнение 3.21(a) int ival = 0;const int *pi = 0;const int &ri = 0;(b) pi = &ival;ri = &ival;Найдите ошибки в приведенных инструкциях:pi = &rval;3.7. Тип bool// инициализация строкиstring search_word = get_word();// инициализация переменной foundbool found = false;string next_word;while ( cin >> next_word )if ( next_word == search_word )found = true;// ...// сокращенная запись: if ( found == true )if ( found )cout << "ok, мы нашли слово\n";Объект типа bool может принимать одно из двух значений: true и false.

Например:else cout << "нет, наше слово не встретилось.\n";Хотя bool относится к одному из целых типов, он не может быть объявлен как signed,unsigned, short или long, поэтому приведенное определение ошибочно:С++ для начинающих// ошибкаshort bool found = false;Объекты типа bool неявно преобразуются в тип int. Значение true превращается в 1, аbool found = false;int occurrence_count = 0;while ( /* mumble */ ){found = look_for( /* something */ );// значение found преобразуется в 0 или 1occurrence_count += found;false – в 0.

Например:}Таким же образом значения целых типов и указателей могут быть преобразованы в// возвращает количество вхожденийextern int find( const string& );bool found = false;if ( found = find( "rosebud" ))// правильно: found == true// возвращает указатель на элементextern int* find( int value );if ( found = find( 1024 ))значения типа bool. При этом 0 интерпретируется как false, а все остальное как true:// правильно: found == true3.8. ПеречисленияНередко приходится определять переменную, которая принимает значения из некоегонабора. Скажем, файл открывают в любом из трех режимов: для чтения, для записи, длядобавления.const int input = 1;const int output = 2;Конечно, можно определить три константы для обозначения этих режимов:const int append = 3;и пользоваться этими константами:108С++ для начинающихbool open_file( string file_name, int open_mode);// ...open_file( "Phoenix_and_the_Crane", append );Подобное решение допустимо, но не вполне приемлемо, поскольку мы не можемгарантировать, что аргумент, передаваемый в функцию open_file() равен только 1, 2или 3.Использование перечислимого типа решает данную проблему.

Когда мы пишем:enum open_modes{ input = 1, output, append };мы определяем новый тип open_modes. Допустимые значения для объекта этого типаограничены набором 1, 2 и 3, причем каждое из указанных значений имеетмнемоническое имя.

Мы можем использовать имя этого нового типа для определения какобъекта данного типа, так и типа формальных параметров функции:void open_file( string file_name, open_modes om );input, output и append являются элементами перечисления. Набор элементовперечисления задает допустимое множество значений для объекта данного типа.Переменная типа open_modes (в нашем примере) инициализируется одним из этихзначений, ей также может быть присвоено любое из них. Например:open_file( "Phoenix and the Crane", append );Попытка присвоить переменной данного типа значение, отличное от одного из элементовперечисления (или передать его параметром в функцию), вызовет ошибку компиляции.Даже если попробовать передать целое значение, соответствующее одному из элементов// ошибка: 1 не является элементом перечисления open_modesперечисления, мы все равно получим ошибку:open_file( "Jonah", 1 );Есть способ определить переменную типа open_modes, присвоить ей значение одного изopen_modes om = input;// ...элементов перечисления и передать параметром в функцию:om = append;open_file( "TailTell", om );Однако получить имена таких элементов невозможно.

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

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

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

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