
- •1)Указатели.
- •3) Инициализация указателей
- •5) Операции с указателями
- •33) Связные структуры данных: стек- описание и операции со стеком.
- •35) Связные структуры данных: очередь- описание и операции.
- •37) Связные структуры данных: список- описание и операции.
- •7) Массивы. Описание одномерных и многомерных массивов, инициализация.
- •9) Ввод и вывод массивов, два способа: с выбором элемента по индексу и с выбором элемента по указателю.
- •27) Передача массивов в качестве параметров.
- •19) . Способы обмена данными: с помощью глобальных переменных.
- •21) Способы обмена данными: Возвращаемое значение.
- •23) Способы обмена данными: Параметры функции.
- •25) Передача параметров по значению и по адресу.
- •29) Параметры со значениями по умолчанию.
- •13) Типы данных, определяемые пользователем: структуры.
- •15)Типы данных, определяемые пользователем: объединения.
- •11) Типы данных, определяемые пользователем: перечисления.
- •4) Понятие класса. Описание класса (Паскаль). Поля и методы. Пример
- •При описании нового объекта с инициализацией другим объектом;
- •При передаче объекта в функцию по значению;
- •При возврате объекта из функции.
- •16) Конструктор и деструктор, их свойства (Паскаль).
- •8) Описание объектов (экземпляров класса) Способы обращения к полям объекта. (Паскаль).
- •17) Функции. Объявление и определение, заголовочные файлы в с и предописания (forward) в Паскале.
- •31) Перегрузка функций.
- •39) Понятие ооп Основные свойства ооп (инкапсуляция, наследование, полиморфизм).
- •24) Виртуальные методы и абстрактные классы.
8) Описание объектов (экземпляров класса) Способы обращения к полям объекта. (Паскаль).
Класс — это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области. Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности, т. е. объекта.
Объект — сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса (например, после запуска результатов компиляции (и связывания) исходного кода на выполнение). Прямое обращение к полям не рекомендуется. Если поля определены в разделе Private, то прямой доступ не возможен. Компилятор сообщит об ошибке. Обращение к полям объекта нужно делать так: <Объект>.<Поле>:=<Значение>; <Переменная>:=<Объект>.<Поле>;
10) Константный указатель на вызвавший метод объект (this ) (C++). Каждый объект содержит свой экземпляр полей класса. Методы класса находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов с полями именно того объекта, для которого они были вызваны. Это обеспечивается передачей в функцию скрытого параметра this, в котором хранится константный указатель на вызвавший функцию объект. Указатель this неявно используется внутри метода для ссылок на элементы объекта. В явном виде этот указатель применяется в основном для возвращения из метода указателя (return this;) или ссылки (return *this;) на вызвавший объект. Для иллюстрации использования указателя this добавим в приведенный выше класс monstr новый метод, возвращающий ссылку на наиболее здорового (поле health) из двух монстров, один из которых вызывает метод, а другой передается ему в качестве параметра (метод нужно поместить в секцию public описания класса): monstr & the_best(monstr &M){ if( health > M.get_health()) return *this; return M; } ... monstr Vasia(50), Super(200); // Новый объект Best инициализируется значениями полей Super: Vasia.the_best(Super); Указатель this можно также применять для идентификации поля класса в том случае, когда его имя совпадает с именем формального параметра метода. Другой способ идентификации поля использует операцию доступа к области видимости: void cure(int health, int ammo){ this -> health += health; // Использование this monstr:: ammo += ammo; // Использование операции :: }
17) Функции. Объявление и определение, заголовочные файлы в с и предописания (forward) в Паскале.
Функция — это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие. Функция может принимать параметры и возвращать значение.
С помощью функций задача может быть разделена на более простые и обозримые, после чего программу можно рассматривать в более укрупненном виде — на уровне взаимодействия функций. Использование функций является первым шагом к повышению степени абстракции программы и ведет к упрощению ее структуры.
Разделение программы на функции позволяет также избежать избыточности кода, поскольку функцию записывают один раз, а вызывать ее на выполнение можно из разных точек программы многократно.
Процесс отладки программы, содержащей функции, можно лучше структурировать. Часто используемые функции можно помещать в библиотеки. Таким образом создаются более простые в отладке и сопровождении программы.
Любая программа на С++ состоит из функций, одна из которых должна иметь имя main(с нее начинается выполнение программы).
Функция начинает выполняться в момент вызова. Любая функция должна быть объявлена и определена. Как и для других величин, объявлений может быть несколько, а определение только одно.
Объявление функции должно находиться в тексте раньше ее вызова для того, чтобы компилятор мог осуществить проверку правильности вызова.
Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип возвращаемого значения и список передаваемых параметров.
Определение функции содержит, кроме объявления, тело функции, представляющее собой последовательность операторов и описаний в фигурных скобках:
[ класс ] тип имя ([ список_параметров ])[throw ( исключения )]
{ тело функции }
Рассмотрим составные части определения.
С помощью необязательного модификатора класс можно явно задать область видимости функции, используя ключевые слова externи static:
extern — глобальная видимость во всех модулях программы (по умолчанию);static — видимость только в пределах модуля, в котором определена функция.
Тип возвращаемого функцией значенияможет быть любым, кроме массива и функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значение, указывается тип void.
Список параметров определяет величины, которые требуется передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя (в объявлении имена можно опускать).
В определении, в объявлении и при вызове одной и той же функции типы и порядок следования параметров должны совпадать.
На имена параметров ограничений по соответствию не накладывается.
Функцию можно определить как встроенную с помощью модификатора inline, который рекомендует компилятору вместо обращения к функции помещать ее код непосредственно в каждую точку вызова. Модификатор inlineставится перед типом функции. Он применяется для коротких функций, чтобы снизить накладные расходы на вызов.
Директива inline носит рекомендательный характер и выполняется компилятором по мере возможности.
Тип возвращаемого значения и типы параметров совместно определяют тип функции.
Для вызова функции в простейшем случае нужно указать ее имя, за которым в круглых скобках через запятую перечисляются имена передаваемых аргументов.
Вызов функции может находиться в любом месте программы, где по синтаксису допустимо выражение того типа, который формирует функция. Если тип возвращаемого функцией значения не void, она может входить в состав выражений или, в частном случае, располагаться в правой части оператора присваивания.
Все величины, описанные внутри функции, а также ее параметры, являются локальными. Областью их действия является функция. При вызове функции, как и при входе в любой блок, в стеке выделяется память под локальные автоматические переменные.
При выходе из функции соответствующий участок стека освобождается, поэтому значения локальных переменных между вызовами одной и той же функции не сохраняются. Если этого требуется избежать, при объявлении локальных переменных используется модификатор static:
void f(int a){
cout << "n m\n";
while (a--){
static int n = 0;
int m = 0;
cout << n++ << ' ' << m++ << '\n';
}}
int main(){ f(3);}
Статическая переменная n размещается в сегменте данных и инициализируется один раз при первом выполнении оператора, содержащего ее определение.
18) Дружественные функции и классы (С++).
Иногда желательно иметь непосредственный доступ извне к скрытым полям класса, то есть расширить интерфейс класса. Для этого служат дружественные функции и дружественные классы.
Дружественные функции применяются для доступа к скрытым нолям класса и представляют собой альтернативу методам. Метод, как правило, используется для реализации свойств объекта, а в виде дружественных функций оформляются действия, не представляющие свойства класса, но концептуально входящие в его интерфейс и нуждающиеся в доступе к его скрытым полям, например, переопределенные
операции вывода объектов.особенности дружественных функций.
• Дружественная функция объявляется внутри класса, к элементам которого ей нужен доступ, с ключевым словом friend. В качестве параметра ей должен передаваться объект или ссылка на объект класса, поскольку указатель this ей не передается.
• Дружественная функция может быть обычной функцией или методом другого ранее определенного класса. На нее не распространяется действие спецификаторов доступа, место размещения ее объявления в классе безразлично.
• Одна функция может быть дружественной сразу нескольким классами. В качестве примера ниже приведено описание двух функций, дружественных классу пюnstг. Функция kill является методом класса hero, а функция steal ammo не принадлежит ни одному классу. Обеим функциям в качестве параметра передается
ссылка на объект класса monstr.
class monstr: // Предварительное объявление класса
class hero{
public:
void killmonstr &):
class monstr{
friend int steal_ammo(monstr &);
friend void hero::kill(monstr &);
//' Класс hero должен быть определен ранее
}:
int steal_ammo(monstr &M){return --M.ammo;}
void hero::kill(monstr &M){M.health = 0: M.ammo = 0;}
Использования дружественных функций нужно по возможности избегать, поскольку они нарушают принцип инкапсуляции и, таким образом, затрудняют отладку и модификацию программы.
Дружественный класс
Если все методы какого-либо класса должны иметь доступ к скрытым полям другого, весь класс объявляется дружественным с помощью ключевого слова friend. В приведенном ниже примере класс mistress объявляется дружественным классу hero:
class hero{
friend class mistress:
}
class mistress!
void f l O:
void f2():
}
Функции f 1 и f2 являются дружественными по отношению к классу hero (хотя и описаны без ключевого слова friend) и имеют доступ ко всем его полям. Объявление friend не является спецификатором доступа и не наследуется.