Добавил:
t.me Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 семестр / Вопросы к экзамену. Моё.docx
Скачиваний:
3
Добавлен:
16.07.2023
Размер:
58.39 Кб
Скачать

Вопросы к экзамену по курсу “Информатика-2 часть ” (ооп)

1. Использование структур как простейших классов.

Структура в C++ представляет собой производный тип данных, который представляет какую-то определённую сущность, также как и класс. Структура также может определять переменные, функции, конструкторы, деструкторы. Однако обычно структуры служат для хранения каких-то общедоступных данных в виде публичных переменных. Для остальных сценариев используются классы.

Структуры отличаются от классов тем, как они сохраняются в памяти и как к ним осуществляется доступ (классы — это ссылочные типы, размещаемые в куче, структуры — типы значений, размещаемые в стеке), а также некоторыми свойствами (например, структуры не поддерживают наследование). Из соображений производительности вы будете использовать структуры для небольших типов данных.

struct MyStruct{

    int x;

    int y;

};

int main(){

    MyStruct A, B;

    A.x = 10;

    A.y = 20;

    B = A;  

    cout << B.x << '\n';        //10

    cout << B.y << '\n';        //20

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

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

2. Модульное программирование в С++.

Модульное программирование – организация программы как совокупности небольших независимых блоков, называемых модулями.

Модуль – это функционально законченный фрагмент программы, оформленный в отдельный файл с исходным кодом.

Заголовочный файл, или как его ещё называют header-файл — это файл, в котором обычно находятся подключения всяческих других заголовочных файлов, библиотек, прототипы функций, некоторые глобальные переменные, структуры, массивы, указатели, макросы и прочие объявления, которые вполне могли бы находиться и в файле с исходным кодом.

3. Основные понятия ООП: инкапсуляция, наследование, полиморфизм и их реализация в языке С++.

ООП – подход к построению программ, главной отправной точкой служит объект с его свойствами и поведением.

Объе́ктно-ориенти́рованное программи́рование (сокр. ООП) — методология программирования, основанная на представлении программы в виде совокупности взаимодействующих объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.

Инкапсуляция – метод языка, разделяющий и ограничивающий доступ к составляющим объектам компонентов (поля и методы).

Инкапсуляция — это когда данные или то, как устроены и работают методы и классы, помещают в виртуальную капсулу, чтобы их нельзя было повредить извне.

Наследование – механизм языка, позволяющий описать новый класс на основе уже существующего класса (базового). Потомок при создании получает все свойства и методы родителя.

Полиморфизм – единообразная обработка разнотипных данных.

Полиморфизм — это когда мы можем вызывать одни и те же методы у разных классов. Внутри они могут работать по-разному, но внешне всё будет выглядеть одинаково.

4. Класс - определение, иерархия классов, область видимости классов.

Класс – тип данных, определяемый пользователем. Класс представляет собой совокупность данных, характеризующих объект этого класса и операции, которые могут быть выполнены с этими данными.

Данные класса – поля / свойства класса.

Функции класса (операции) – методы / функции класса (набор действий).

Интерфейс класса – заголовки методов класса.

Каждое определение класса представляет собой отдельную область видимости класса.

Иерархия классов - отношения между родительским классом и его

потомками. (Кто от кого наследует и с каким ключом доступа.) Родительский или базовый класс (класс родитель) - класс, выступающий в

качестве основы при наследовании.

Класс потомок (порожденный класс, класс наследник) - класс, образованный

в результате наследования от родительского класса.

Интерфейс класса - совокупность публичных методов класса, доступная для

использования вне класса.

Реализация класса - совокупность методов и данных класса.

5. Конструкторы. Варианты вызова конструкторов, классификация конструкторов по умолчанию, инициализации, копирования. Инициализация объектов с помощью конструкторов.

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

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

Конструктор не возвращает значения, даже типа void. Нельзя получить указатель на конструктор.

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

Параметры конструктора могут иметь любой тип, кроме типа того же класса.

В конструкторе можно использовать параметры по умолчанию.

Если программист не указал ни одного конструктора, то компилятор создаёт его автоматически, кроме случаев, когда класс содержит константы и ссылки. Такой конструктор вызывает конструктор по умолчанию для полей класса и конструктор базового класса.

Конструкторы не наследуются.

Конструктор не может быть константным или виртуальным.

Конструкторы глобальных объектов вызываются до вызова функции main. Локальные – где объявлены.

––––––––––––––––––

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

#include <iostream>

using namespace std;

class myclass {

int a;

int b;

public:

myclass(int x=0, int y=0) {

a = x;

b = y;

}

void print() {

cout << a << " " << b;

}

myclass(const myclass& h) {

a = h.a;

b = h.b;

}

};

int main(void) {

myclass a1(3, 2);

myclass a2(a1);

a2.print();

return 0;

–––––––––––––––––––––

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

class date {

int month, day, year;

public:

date(int, int, int);

date(char*);

date() {

Health = 0;

Ammo = 1;

}; // конструктор по умолчанию

};

––––––––––––––––––––––

Конструктор инициализатор. Вместо копирования тела конструктора класса-предка вызываешь его короткой конструкцией.

class A {

int a, b;

public:

A(int _a=0, int _b=0) {

a=_a; b=_b;

}

};

class B : public A {

int c;

public:

B(int _a, int _b, int _c) : A(_a, _b) {

c=_c;

}

};

Список инициализации используется, если:

1. Поля являются константными (const)

2. Поля являются ссылочными

3. Поля являются объектами другого класса.

6. Конструктор копирования, назначение и пример.

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

Конструктор копирования имеет в качестве своего первого параметра (возможно, const или volatile) ссылку на свой собственный тип класса.

X(const X& copy_from_me);

X(X& copy_from_me);

Конструктор копирования должен получать входным параметром константную ссылку (&) на объект такого же класса.

С помощью конструктора копирования можно получить копию уже существующего объекта.

7. Деструкторы. Назначение и определение. Пример.

Деструктор – это функция-член, которая вызывается автоматически, когда объект выходит из области видимости. Для объектов, заданных через указатели, деструктор вызывается неявно через оператор delete. Служит для деинициализации объекта (освобождение памяти, закрытие файлов и т.п.).

Деструктор имеет то же имя, что и класс, перед которым стоит тильда (~).

Свойства: 1. Не имеет аргументов и возвращаемого значения. 2. Не может быть объявлен как const. 3. Не наследуется. 4. Не может быть виртуальным. 5. Если явным образом не определён, компилятор автоматически создаёт пустой деструктор.

~matr() {

A=0; B=0;

int i;

for(i = 0; i < N; i++) {

delete [] base[i];

}

delete [] base;

}

8. Указатель this и его использование. Примеры.

Каждый объект содержит свой экземпляр полей класса. Методы не занимают в классе места и не дублируются для каждого объекта. Единственный экземпляр метода используется всеми объектами совместно.

При описании класса автоматически объявляется переменная с именем this. Она указывает на текущий экземпляр класса:

ИмяКласса *this;

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

Указатель this – указатель на объект, из которого мы вызываем метод. С помощью указателя this и оператора -> можно обратиться к полям класса.

class Point{

int x, y;

public:

Point(int x, int y) {

this->x = x;

this->y = y;

}

Point &move(int x, int y) {

this->x += x;

this->y += y;

return *this;

}

9. Дружественные функции. Дружественный метод, определение и примеры.

Дружественная функция – функция, которая, не являясь компонентом класса, имеет доступ к его защищённым и собственным компонентам. Функция объявляется в теле класса, описывается вне класса.

class k1 {

int a, b;

public:

friend int sum(k1 x);

void set_ab(int i, int j);

};

void k1::set_ab(int i, int j) {

a=i; b=j;

}

int sum(k1 x) {

return x.a + x.b;

}