LEC_cpp2 (1119517)

Файл №1119517 LEC_cpp2 (Лекции Волковой 2009)LEC_cpp2 (1119517)2019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла

3 лекция - C++ (2).

О терминологии

Будем использовать следующую терминологию:

Оператор (statement, обычно переводится как оператор) – действие, задаваемое некоторой конструкцией языка, и

Операция (operator, для обозначения операций языка: +, *, =, и др.) – используются в выражениях.

Определение переменной (definition, при этом отводится память, производится инициализация, определение возможно только 1 раз) и

Объявление переменной (declaration, дает информацию компилятору о том, что эта переменная где-то в программе описана).

Для преобразования типов используются два термина – преобразование (conversion, явное) и приведение (cast, автоматическое).

Отличия языков С и С++.

Кроме главного - С++ поддерживает все элементы ООП - есть и другие его полезные отличия от С:

1. Введен логический тип bool и константы логического типа true и false.

2. Введен тип ссылка на переменную (reference), который определяется так:

<тип> & <переменная> = <инициализирующее выражение>;

Ссылка по сути является синонимом имени переменной.

Например,

int i=5;

int &yeti=i; //ссылка обязательно должна быть инициализирована

i=yeti+1;

yeti=i+1;

cout << i << yeti; //напечатается 7 7

Ссылки в основном используются:

а) для передачи параметров по ссылке (не обязательно передавать в функцию явные адреса переменных, значения которых должны в функции измениться);

б) для возвращения результата работы функции в виде ссылки (для более эффективной реализации функции - т.к. не надо создавать временную копию возвращаемого объекта – и в том случае, когда возвращаемое значение должно быть L-value-выраженем ).

Пример 1:

void swap (int & x, int & y) {

int t=x;

x = y;

y = t;

}

Обращение к функции swap: int a = 5, b = 6;

swap (a, b);

Пример 2. Пусть нам надо определить свою операцию [] (в виде перегруженной функции). Как правило, эта операция используется для обращения к элементу некоторого набора данных и, как правило, надо иметь возможность этому элементу что-то присвоить. В таком случае следует возвращать результат функции в виде ссылки на элементы соответствующего типа. Содержательный пример на возвращаемое значение функции в виде ссылки мы рассмотрим позже.

3. В С++ отсутствуют типы по умолчанию (например, обязательно int main () {…}).

4. Локальные переменные можно объявлять в любом месте программы, в частности внутри цикла for.

5. В С++ переработана стандартная библиотека, которая затронула помимо ввода-вывода несколько новых специфичных областей, например, шаблоны. В стандартной библиотеке С++ файл заголовков ввода/вывода назвается <iostream>.

В частности, введены классы, соответствующие стандартным (консольным) потокам ввода – класс istream – и вывода – класс ostream, а также объекты cin (класса istream) и cout и cerr (класса ostream).

Через эти объекты доступны операторы ввода >> из стандартного потока ввода (например, cin >> x ;), и вывода << в стандартный поток вывода (например, cout << ”string” << S << ‘\n’;), при использовании которых не надо указывать никакие форматирующие элементы.

6. Для выделения и освобождения динамической памяти наряду с функциями malloc() и free() в С++ можно пользоваться операторами new и delete :

Например, int *p,*m;

p = new int ; или

p = new int (1); или

m = new int [10]; - для массива из 10 элементов;

…….

delete p; или

delete [] m; -для удаления всего массива;

7. В С++ введено понятие пространства имен (namespace) – это некоторая объявляемая область локализации имен, введенная для того, чтобы избежать конфликта имен идентификаторов. Традиционно содержимое заголовочных файлов располагалось в едином глобальном пространстве имен.

Средства стандартной библиотеки в соответствии с новым стилем определены в пространстве имен std и представлены набором стандартных заголовков (<iostream>, <cstdio>, <list>…около 60), по которым компилятор находит требуемые файлы. Такие заголовки по-прежнему включаются в программу с помощью инструкции #include . Чтобы пространство имен std стало видимым, надо использовать следующую инструкцию:

using namespace std;

Эта инструкция делает все имена, определенные в std, доступными в текущем пространстве имен, и с ними можно работать напрямую, без необходимости каждый раз указывать имя пространства и оператор разрешения области видимости (std::…).

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

namespace имя {

// объявления

}

Namespace используется на файловом уровне. Могут быть вложенные пространства имен, но, например, внутри блока или функции namespace употребляться не может.

Безымянное пространство имен позволяет задавать идентификаторы, уникальные внутри одного файла.

Вероятно, от введения пространства имен больше всего выиграла стандартная библиотека С++.

В настоящее время введен новый формат задания заголовочных файлов (без .h). Также поддерживается и старый стиль оформления заголовочных файлов. Так, стандартный заголовок, имя которого начинается с буквы с в пространстве имен std - <сХ> - эквивалентен заголовочному файлу стандартной библиотеки С <X.h> в глобальном пространстве имен.

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

#include <iostream>

using namecpace std;

или для старых компиляторов:

#include <iostream.h>

Более подробно с правилами задания пространства имен и использованием инструкции using вы можете познакомиться в книге Б.Страуструпа «ЯП С++.Спец. изд.» на стр. 211-216 и 924-926.

Указатель this.

В определённых ситуациях для реализации того или иного метода возникает необходимость иметь указатель на «свой» объект, от имени которого производится вызов данного метода. Для удобства Б. Страуструп ввёл в C++ ключевое слово this, означающее «указатель на себя», которое можно трактовать как неявное поле данных любого класса (const <имя класса> * this;). *this – сам объект. Если this участвует в описании функции, перегружающей операцию, то он всегда указывает на самый левый (в записи вызова) операнд метода. Следует учесть, что в реальности это поле не существует (не расходуется память) и при сборке просто подменяется на соответствующий адрес объекта.

Специальные функции класса - конструкторы и деструкторы.

Конструкторы — используются для инициализации объектов, как правило, вызываются автоматически при создании объектов.

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

Например: class A {

......

public:

A ();

[explicit] A (int x); // explicit запрещает неявное

// преобразование int в А

A (A & y);// A (const A & y);

A (int x, int y);

......

}

Конструктор без параметров принято называть конструктором умолчания.

Конструктор с одним параметром принято называть конструктором преобразования (объекта типа формального параметра в объект данного класса).

Конструктор с одним параметром – ссылкой на свой класс – называется конструктором копирования.

Другие конструкторы особых названий не имеют.

Параметры для конструкторов задаются в круглых скобках через запятую при описании объектов рядом с их именем.

Например: A obj (1);

Деструкторы — применяются для уничтожения объектов перед тем, как они станут недоступными, как правило, вызываются автоматически.

Деструктор имеет имя ~<имя_класса>. Возвращаемого значения нет, параметров нет.

Например, ~A();

Пусть есть класс Box:

class Box {

int l; // length – длина

int w; // width – ширина

int h; // height – высота

public:

int volume () { return l * w * h ;}

// далее пример перегрузки конструкторов:

// для задания начальных значений всех трех параметров

Box (int a, int b, int c ) {l = a; w = b; h = c;}

// допустим, часто используются кубики, тогда

Box (int s) {l = w = h = s;}

// допустим, часто используются коробки одного типа, тогда

Box () {w = h = 1; l = 2}

// обычно в класс входят интерфейсные функции

//для просмотра закрытых данных класса:

int get_l () {return l;}

int get_w () {return w;}

int get_h () {return h;}

};

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

Если в классе явно не определён конструктор копирования, он будет сгенерирован автоматически, при этом производится почленное копирование данных объекта.

Box (const Box & a) { l = a.l; w = a.w; h = a.h; }

Если не описан деструктор, то он тоже генерируется автоматически. Деструктор по умолчанию ничего не делает.

Пусть есть функция f, в которой определяются следующие объекты класса Box:

void f {

Box b1 (1,2 3);

Box b2 (5);

Box b3; // но! нельзя Box b3 (); , т.к. такая запись может совпадать с

// прототипом функции Box b3 () {...};

При описании объекты можно инициализировать значениями полей данных другого объекта соответствующего типа, аналогично инициализации других переменных (с помощью оператора =). При этом вместо обычного конструктора работает конструктор копирования. А чтобы скопировать один объект в другой уже после их создания и инициализации, используется оператор присваивания «=».

Box * b4 = new Box (2, 3, 5);

Box b5 = *b4; // инициализация

Box b6 = Box (4,7,1); // сначала создается временный объект и вызывается

обычный конструктор, а затем работает конструктор копирования при создании объекта b6, далее деструктор временного объекта;

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

Box b7 = 5; // ~ Box b7 = Box (5); сначала работает конструктор преобра-

зования, а затем копирования, далее деструктор временного объекта; в оптимизирующих компиляторах работает только конструктор преобразования ( как в предыдущем случае , т.е. Box b7 (5); )

....

b2 = b3; // присваивание

......

}

По умолчанию, оператор присваивания производит почленное копирование одного объекта в другой, при этом деструктор приемника не вызывается.

Box & operator = ( const Box &a) { l = a.l; w = a.w; h = a.h; return *this;}

Оператор присваивания и конструктор копирования можно переопределить самим. Так как в обеих ситуациях производится однотипное копирование, то надо одновременно и идентично переопределять и конструктор копирования, и оператор присваивания.

Замечание: операцию присваивания можно переопределить только с помощью неконстантного метода класса.

Прототип переопределяемого оператора присваивания такой:

Box & operator = (const Box &);

Возвращаемый результат имеет тип Box& с целью эффективности реализации, чтобы не создавался временный объект, который возвращается в качестве результата работы функции в случае типа результата просто Box. А результат (объект) должен возвращаться, чтобы можно было реализовать цепочку присваиваний типа a = b = c;

Замечания:

1) b = a; ~ b.operator=(a); // this в теле оператора указывает на b

2) Основное отличие между оператором присваивания и конструктором копирования состоит в том, что конструктор копирования инициализирует «чистую» память, он вызывается только в момент описания объекта A b(a);. Оператор присваивания работает уже с созданным объектом, поэтому в нём необходимо сначала очистить объект-приемник, а потом производить копирование.

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

Тип файла
Документ
Размер
106,5 Kb
Тип материала
Высшее учебное заведение

Тип файла документ

Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.

Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.

Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.

Список файлов лекций

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