- •Ооп. Абстракция, полиморфизм, наследование, инкапсуляция
- •Методы класса: классификация методов, доступ к членам класса, неявный параметр this. Определение и реализация методов. Использование методов для экземпляров класса.
- •Перегрузка функций: правила перегрузки, выбор функции. Использование перегруженных функций.
- •Перегрузка операторов: правила перегрузки, перегрузка бинарных и унарных операторов. Использование перегруженных операторов. Понятие объектов функций (функторов).
- •Перегрузка унарных операторов
- •Бинарные операторы
- •Преобразования типа: назначение, использование. Правила преобразования типа. Возможные проблемы.
- •Оператор присваивания
- •Типы отношений между классами. Контейнерные классы: определение, видимость членов класса. Реализация и вызов конструкторов и деструкторов вложенных классов. Реализация и использование методов.
- •Вложенные классы
- •12. Понятие и назначение итераторов. Проектирование, реализация и использование итератора (на примере динамического списка).
Перегрузка функций: правила перегрузки, выбор функции. Использование перегруженных функций.
Перегрузка функций позволяет вашим программам определять несколько функций с одним и тем же именем и типом возвращаемого значения.
Cуществует два основных способа перегрузки операторов: глобальные функции, дружественные для класса, или подставляемые функции самого класса.
int add_values(int a,int b) //Перегруженная функция (2 параметра)
{ return(a + b); }
int add_values (int a, int b, int c) // Перегруженная функция (3 параметра)
{ return(a + b + c); }
void main(void)
{ cout << "200 + 801 = " << add_values(200, 801) << endl; // Использование функции с 2 параметрами cout << "100 + 201 + 700 = " << add_values(100, 201, 700) << endl; // Использование функции с 3 параметрами }
Одним из наиболее общих случаев использования перегрузки является применение функции для получения определенного результата, исходя из различных параметров.
Перегрузка операторов: правила перегрузки, перегрузка бинарных и унарных операторов. Использование перегруженных операторов. Понятие объектов функций (функторов).
Синтаксис перегрузки
class Integer
{
private:
int value;
public:
Integer(int i): value(i)
{}
const Integer operator+(const Integer& rv) const { //перегрузка унарного оператора
return (value + rv.value);
}
};
Перегрузка унарных операторов
Рассмотрим примеры перегрузки унарных операторов(++,--) для определенного выше класса Integer. Заодно определим их в виде дружественных функций и рассмотрим операторы декремента и инкремента:
class Integer
{
private:
int value;
public:
Integer(int i): value(i)
{}
//префиксный инкремент
friend const Integer& operator++(Integer& i);
//постфиксный инкремент
friend const Integer operator++(Integer& i, int);
};
//префиксная версия возвращает значение после инкремента
const Integer& operator++(Integer& i) {
i.value++;
return i;
}
//постфиксная версия возвращает значение до инкремента
const Integer operator++(Integer& i, int) {
Integer oldValue(i.value);
i.value++;
return oldValue;
}
В случае, когда он видит выражение ++i, то вызывается функция operator++(a). Если же он видит i++, то вызывается operator++(a, int). То есть вызывается перегруженная функция operator++, и именно для этого используется фиктивный параметр int в постфиксной версии.
Бинарные операторы
Рассмотрим синтаксис перегрузки бинарных операторов. Перегрузим один оператор, который возвращает l-значение, один условный оператор и один оператор, создающий новое значение (определим их глобально):
class Integer
{
private:
int value;
public:
Integer(int i): value(i)
{}
friend const Integer operator+(const Integer& left, const Integer& right);
friend Integer& operator+=(Integer& left, const Integer& right);
friend bool operator==(const Integer& left, const Integer& right);
};
const Integer operator+(const Integer& left, const Integer& right) {
return Integer(left.value + right.value);
}
Integer& operator+=(Integer& left, const Integer& right) {
left.value += right.value;
return left;
}
bool operator==(const Integer& left, const Integer& right) {
return left.value == right.value;
}
Друзья класса: их назначение, области применения. Определение и использование функции-друга класса. Различия между членами и друзьями класса. Функции и перегруженные операторы – члены и друзья класса.
Принцип инкапсуляции и ограничения доступа к данным запрещает функциям, не являющимся методами соответствующего класса, доступ к скрытым или защищенным данным объекта. Политика этих принципов ООП такова, что , если функция не является членом объекта, она не может пользоваться определенным рядом данных. Тем не менее есть ситуации, когда такая жесткая дискриминация приводит к значительным неудобствам.
C++ позволяет друзьям определенного класса обращаться к частным элементам этого класса. Чтобы указать C++, что один класс является другом (friend) другого класса, вы просто помещаете ключевое слово friend и имя соответствующего класса-друга внутрь определения этого другого класса.
class beta;
class alpha {
private:
int data;
public:
alpha():data(3) {} //конструктор без аргументов
friend int frirunc(alpha, beta); // дружественная функция
};
class beta {
private:
int data;
public:
beta():data(7) {}
friend int frifunc(alpha, beta);
};
int frifunc(alpha a, beta b) { //определение функции
return (a.data + b.data);
};
int main() { alpha aa;
beta bb;
cout << frifunc(aa, bb) << endl; // вызов функции
return 0;
}
Главное не забывать, что обращаться к классу до его объявления нельзя, иначе будет ошибка, именно поэтому beta объявлен в начале, а определен позже.