
- •1. Объявление класса. Примеры. Понятие инкапсуляции, полиформизма, наследования.
- •2. Доступ к членам класса. Управление доступом к членам класса. Указатель this. Примеры.
- •3. Конструкторы и деструкторы. Параметризованные конструкторы. Примеры.
- •4. Дружественные ф-ции. Примеры.
- •5. Перегрузка функций. Значение аргументов ф-ции по умолчанию. Примеры.
- •6. Наследование. Примеры.
- •7. Передача объектов в ф-ции и возврат объекта из ф-ции. Массивы объектов. Примеры.
- •8. Перегрузка операторов при помощи функций-членов класса. Примеры.
- •9. Перегрузка операторов при помощи дружественных ф-ций. Примеры.
- •10. Ссылки, ссылки на объекты. Примеры.
- •11. Конструктор копирования. Примеры
- •12. Наследование и спецификаторы доступа. Примеры.
- •13. Конструкторы и деструкторы производных классов. Примеры.
- •14. Указатели и ссылки на производные типы. Примеры.
- •Ссылки на производные классы
- •15. Виртуальные ф-ции. Примеры.
- •16. Чисто виртуальные ф-ции и абстрактные классы. Примеры.
- •17. Обработка исключений. Примеры.
- •18. Создание собственных операторов вставки и извлечения. Примеры.
- •19. Файловый ввод-вывод. Примеры.
- •20. Формирование ввода-вывода. Примеры.
- •21. Двоичные файлы. Примеры.
- •22. Произвольный доступ. Примеры.
- •23. Ввод-вывод в массивы Примеры.
- •24. Класс string. Примеры.
- •25. Функции-шаблоны. Примеры.
- •Явная перегрузка функций-шаблонов
- •26. Классы-шаблоны. Примеры.
- •27. Пространства имён. Примеры.
- •28. Статические члены класса. Примеры.
- •30. Идентификация типа во время исполнения. Примеры.
- •31. Новые операторы приведения типов. Примеры.
- •32. Контейнерные классы. Примеры.
7. Передача объектов в ф-ции и возврат объекта из ф-ции. Массивы объектов. Примеры.
Передача объектов в функции
Объекты могут быть переданы в функции тем же способом, что и переменные любого другого типа. Объекты передаются функциям с использованием стандартного механизма передачи по значению. Это означает, что создается копия объекта, которая и передается функции. Это означает, что создается другой объект. В результате возникает вопрос, исполняется ли функция-конструктор объекта при создании копии и исполняется ли функция-деструктор, когда копия уничтожается.
Чтобы не возникало проблем необходимо определить оператор копирования для класса, который называется конструктором копирования.
Возвращение объектов функциями
Функция может возвращать объект в точку вызова.
Когда функция возвращает объект, автоматически создается временный объект, содержащий возвращаемое значение. После того, как значение возвращено, этот объект уничтожается. Уничтожение временного объекта может вызвать неожиданные побочные эффекты. Для того чтобы преодолеть эту проблему используется перегрузка оператора присваивания и определение конструктора копирования.
Массивы объектов
Можно создавать массивы объектов точно так же, как создаются массивы данных других типов.
Инициализация массивов объектов
Если класс определяет конструктор с параметрами, то можно инициализировать каждый объект массива путем указания списка инициализации в точности так же, как это делается для массивов других типов. Однако точная форма списка инициализации будет определяться числом параметров конструктора.
Пример
#include <iostream>
using namespace std;
class cl{
int h;
int i;
public:cl(int j, int k) {h=j; i=k;}
int get_i() {return i; }
int get_h() {return h;}
};
int main()
{
cl ob[3] = {
cl(1, 2),
cl(3, 4),
cl(5, 6)
};
int i;
for (i=0; i<3; i++) {
cout << ob[i].get_h();
cout << “, “;
cout << ob[i].get_i() << “\n”;
}
return 0;
}
Для создания неициализированных массивов необходимо иметь конструктор без параметров.
Если в классе определен конструктор с параметрами, каждый объект в массиве инициализируется с помощью списка инициализации, как это принято для массивов любого типа. Однако точный вид списка инициализации зависит от количества параметров конструктора. Если конструктор имеет лишь один параметр, моно просто задать список начальных значений, используя обычные синтаксические конструкции, предназначенные для инициализации массивов.
8. Перегрузка операторов при помощи функций-членов класса. Примеры.
Следующие операторы не могут быть перегружены:
. :: .* ?
тип имя_класса::operator#(список аргументов)
{
// действия, определённые применительно к классу
}
Здесь перегруженный оператор подставляется вместо символа #, а тип
задает тип значений, возвращаемых оператором. Для того, чтобы упростить
использование перегруженного оператора в сложных выражениях, в качестве
возвращаемого значения часто выбирают тот же самый тип, что и класс, для
которого перегружается оператор.
#include <iostream>
using namespace std;
class three_d {
int x
public:
three_d operator+(three_d t);
three_d operator=(three_d t);
void show();
void assign(int mx, int my, int mz);
};
three_d three_d::operator+(three_d t)
{
three_d temp;
temp.x=x+t.x;
return temp;
}
three_d three_d::operator=(three_d t)
{
x=t.x;
return *this;
}
Если рассмотреть эту программу внимательно, может вызвать удивление,
что обе функции-оператора имеют только по одному параметру, несмотря на то,
что они перегружают бинарный оператор. Это связано с тем, что при
перегрузке бинарного оператора с использованием функции-члена ей
передаётся явным образом только один аргумент. Вторым аргументом служит
указатель this, который передаётся ей неявно. Так, в строке
temp.x = x+t.x;
x соответствует this->x, где x ассоциировано с объектом, который вызывает
функцию-оператор. Объект, стоящий справа от знака операции, передаётся
функции.
При перегрузке унарной операции функция-оператор не имеет
параметров, а при перегрузке бинарной операции функция-оператор имеет один
параметр. (Нельзя перегрузить триадный оператор.) Во всех случаях объект,
активизирующий функцию-оператор, передаётся неявным образом с помощью
указателя this.