
- •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. Контейнерные классы. Примеры.
9. Перегрузка операторов при помощи дружественных ф-ций. Примеры.
Дружественная функция-оператор
Функция-оператор может быть другом класса, а не только его членом. Поскольку функции-друзья не являются членами класса, они не могут иметь неявный аргумент this. Поэтому при перегрузке дружественной бинарной функции-оператора оба операнда передаются функции, а при перегрузке
унарных операторов передаётся один операнд. Следующие операторы не могут использовать перегрузку с помощью функций-друзей: =, (), [], и ->. В качестве примера ниже рассматривается модифицированная версия предыдущей программы, в которой оператор + перегружен с помощью дружественной функции.
#include <iostream>
using namespace std;
class three_d {
int x,y,z;
public: friend three_d operator+(three_d op1, three_d op2);
three_d operator=(three_d t);
void show();
void assign(int mx, int my, int mz);
};
three_d operator+(three_d op1, three_d op2)
{
three_d temp;
temp.x=op1.x+op2.x;
temp.y=op1.y+op2.y;
temp.z=op1.z+op2.z;
return temp;
}
three_d three_d::operator=(three_d t)
{
x=t.x;
y=t.y;
z=t.z;
return *this;
}
void three_d::show()
{
cout << x <<",";
cout << y <<",";
cout << z <<"\n";
}
void three_d::assign(int mx, int my, int mz)
{
x=mx;
y=my;
z=mz;
}
int main()
{
three_d a,b,c;
a.assign(1,2,3);
b.assign(10,10,10);
a.show();
b.show();
c=a+b;
c.show();
c=a+b+c;
c.show();
c=b=a;
c.show();
b.show();
return 0;
}
Перегрузка бинарного оператора с использованием дружественных функций позволяет использовать встроенные типы с объектами в одном выражении.
10. Ссылки, ссылки на объекты. Примеры.
Ссылка по существу является неявным указателем. Она используется как другое имя объекта. Ссылка – неявный указатель. Используется для передачи параметров функции, для возврата значения ф-ции и в качестве самостоятельных переменных.
Параметры-ссылки
По умолчанию С++ передаёт аргументы в функцию по значению. В С++ можно создавать передаваемые по ссылке параметры. Для этого при объявлении функции перед параметром ставится знак амперсанта &.
Пример
void f(int &f)
{ f = rand( ); }
Инструкция
f = rand( );
не использует оператор *. При объявлении параметра-ссылки компилятор С++ знает, что это неявный указатель, и обрабатывает его соответствующим образом. Во фрагменте кода
int val;
f(val);
printf(“%d”, val);
адрес переменной val, а не значение этой переменной, передаётся функции f(). Благодаря этому функция f() может модифицировать значение переменной val. При вызове функции f() нет необходимости ставить оператор взятия адреса & перед переменной val.
На применение переменных ссылочного типа имеется ряд ограничений:
1. Нельзя взять ссылку от переменной ссылочного типа, иными словами, нельзя взять её адрес.
2. Нельзя создать массив ссылок.
3. Нельзя создать указатель на ссылку.
4. Ссылки на битовые поля не допускаются.
Передача ссылок на объекты
Когда объект передаётся функции как аргумент по значению, создаётся копия объекта. При создании этой копии конструктор объекта не вызывается. Вместо этого делается точная копия объекта. Однако, по окончании выполнения функции вызывается деструктор копии объекта. Если эти действия нежелательны, то надо передать объект в функцию по ссылке. При передаче по ссылке копия объекта не создаётся. Это также означает, что копия не будет уничтожаться при выходе из функции и соответственно не будет вызван
деструктор.
При передаче параметров по ссылке следует помнить, что все изменения происходящие с параметром внутри ф-ции, отражаются в вызывающем модуле. Передача по ссылке происходит быстрее, чем по значению.
Пример
#include<iostream>
using namespace std;
class cl {
int id;
public: int i;
cl(int i);
~cl( );
void neg(cl &o) { o.i = -o.i; }
};
cl::cl(int num)
{
cout << “Constructing “ << num << “\n”;
id = num;
}
cl::~cl( )
{
cout << “Destructing “ << id << “\n”;
}
int main( )
{
cl o(1);
o.i = 10;
o.neg(o);
cout << o.i << “\n”;
return 0;
}
Программа выдаст следующие результаты
Constructing 1
-10
Destructing 1
Возврат ссылок
Функция может возвращать ссылку на объект. Такая функция может использоваться в левой части оператора присваивания.
Пример
#include<iostream>
using namespace std;
char &replace(int i); // возврат ссылки
char s[80] = “Hello There”;
int main( )
{
replace(5) = ‘X’; // вставляем символ Х между словами
cout << s;
return 0;
}
char &replace(int i)
{
return s[i];
}
Программа выведет на экран: HelloXThere
Независимые ссылки
Можно объявлять переменные ссылочного типа и как самостоятельные переменные. В таком случае они называются независимыми ссылками. Независимые переменные ссылочного типа должны быть
инициализированы при своём объявлении. Использование ссылок для перегрузки унарных операторов
Для того чтобы выполнить перегрузку унарных операторов ++ и – с помощью функции-друга, необходимо использовать параметр ссылочного типа.
Пример
there_d operator++(three_d &op1)
{
op1.x++;
op1.y++;
op1.z++;
return op1;
}