- •Введение в понятие класса
- •Void queue::init(void)
- •Перегруженные функции
- •Int sqr_it(int I); // Прототипы
- •Перегрузка операций.
- •Наследование
- •Конструкторы и деструкторы
- •Int sloc,rloc;
- •Void qput(int); // Прототип
- •Int qget(void); // Прототип
- •Конструктор с параметрами
- •Конструктор копирования
- •Void input();
- •Void output();
- •Void ThreeAngle::input()
- •Void ThreeAngle::output()
- •Void main(void)
- •Дружественные функции
- •Замечание
- •Дружественные классы
- •Аргументы функций, задаваемые по умолчанию
- •Void main(void)
- •Void stringxy(char *str, int X, int y)
- •Структуры и классы
- •Объединения и классы
- •Void main()
- •Наследование классов
- •Конструкторы с параметрами при наследовании
- •Множественное наследование
- •Перегрузка функций и операций
- •Ключевое слово this
- •Перегрузка операций ввода/вывода. Инсерторы и экстракторы
- •Void main(void)
- •Vector a(1,2,3),b(4,5,6);
- •Void main(void)
- •Vector a(1,2,3),b(4,5,6);
- •Void main(void)
- •Vector a(1,2,3);
- •Дружественные функции-операции
- •Void main(void)
- •Void swap1(int *I, int *j)
- •Void swap(int a, int b)
- •Void swap1(int *I, int *j)
- •Void swap2(int &a, int &b)
- •Использование ссылочных переменных для перегрузки унарных операций
- •Перегрузка операции индексации [ ]
- •Использование виртуальных функций
- •Указатели на производные типы
- •Виртуальные функции
- •Замечания к использованию виртуальных функций
- •Пример использования виртуальных функций
- •Чистые виртуальные функции и абстрактные типы
- •Производные классы и их конструкторы и деструкторы
- •Void main()
- •Конструкторы и деструкторы при множественном наследовании
- •Void main()
- •Виртуальные базовые классы.
- •Операции динамического выделения памяти new и delete
- •Void main(void)
- •Void main(void)
- •Виртуальные деструкторы
- •Void main(void)
- •Void main(void)
- •Шаблоны классов и функций
- •Шаблоны функций
- •Void main(void)
- •Void main(void)
- •Шаблоны классов
- •Int sloc, rloc;
- •Void qput(t I);
- •Void main(void)
- •Статические члены класса
- •Локальные классы
- •Void f(void);
- •Void main(void)
- •Void f(void)
- •Вложенные классы
- •Void main(void)
Void main(void)
{
Vector a(1,2,3),b(4,5,6);
cout<<a<<”\n”<<b<<”\n”;
}
Общая форма функции инсертора следующая:
ostream &operator <<(ostream &stream, class_type obj)
{
// тело программы
return stream;
}
Используется вариант
stream << obj.x<<”, “; а не cout<< obj.x<<”, “;
так как второй вариант жестко связан с потоком cout, a первый вариант может быть применен к любому потоку.
В предыдущем примере данные-члены класса vector объявлены как public. Функция – инсертор не может быть членом класса. Для того, чтобы она имела доступ к приватным элементам класса, необходимо объявить ее “другом“ класса. Тогда предыдущий пример будет иметь вид:
#include <iostream.h>
class vector{
public:
int x, y, z;
vector (int a, int b, int c) { x=a; y=b; z=c;}
friend ostream &operator <<(ostream &stream, vector obj);
}
ostream &operator <<(ostream &stream, vector obj)
{
stream << obj.x<<”, “;
stream << obj.y<<”, “;
stream <<obj.z<<”\n”;
return stream:
}
Void main(void)
{
Vector a(1,2,3),b(4,5,6);
cout<<a<<”\n”<<b<<”\n”;
}
Для перегрузки функции >> для класса vector можно использовать следующую функцию-экстрактор:
istream &operator <<(istream &stream, vector obj)
{
cout<<”Enter x,y,z:”;
stream >> obj.x>>obj.y>>obj.z;
return stream:
}
Так же как и инсертор, функции-экстрактор не может быть членом класса, а поэтому используется как дружественная функция класса. Рассмотрим пример с использованием функции-экстрактора.
#include <iostream.h>
class vector{
public:
int x, y, z;
vector (int a, int b, int c) { x=a; y=b; z=c;}
friend ostream &operator <<(ostream &stream, vector obj);
friend istream &operator <<(istream &stream, vector obj);
}
ostream &operator <<(ostream &stream, vector obj)
{
stream << obj.x<<”, “;
stream << obj.y<<”, “;
stream <<obj.z<<”\n”;
return stream:
}
istream &operator <<(istream &stream, vector obj)
{
cout<<”Enter x,y,z:”;
stream >> obj.x>>obj.y>>obj.z;
return stream:
}
Void main(void)
{
Vector a(1,2,3);
cout<<a;
cin>>a;
cout<<a;
}
Дружественные функции-операции
Функции-операции могут быть членами класса или дружественными функциями класса. Отличие дружественных функций состоит в том, что для них не используется указатель this. При объявлении дружественной функции-оператора должны передаваться два аргумента для бинарных операций и один для унарных операций. Дружественными функциями не могут перегружаться операции =, (), [],->.
Пример перегрузки операции + для класса vector с помощью дружественной операции.
class vector
{
int x,y,z; // Три координаты
public:
friend vector operator + (vector t1, vector t2);
vector operator+(vector t);
void show(void);
void assign( int mx, int my, int mz);
};
vector operator+(vector t1, vector t2)
{
vector temp;
temp.x=t1.x+t2.x;
temp.y=t1.y+t2.y;
temp.z=t1.z+t2.z;
return temp;
}
Во многих случаях преимуществ использования дружественных функций перед функциями-членами при перегрузке нет. Однако есть ситуация, в которой использование дружественных функций обязательно. Перегрузку операции умножения объекта типа vector на целое можно записать и в виде функции-члена и в виде дружественной функции. В то же время операцию умножения целое на vector можно определить только через дружественную функцию.
#include <iostream.h>
class CL{
public:
int c;
CL operator=(int i);
friend CL operator+(CL ob, int i);
friend CL operator+(int i, CL ob);
};
CL CL::operator=(int i)
{
c = i;
return *this;
}
CL operator+(CL ob, int i)
{
CL temp;
temp.c=ob.c+i;
return temp;
}
CL operator+(int i, CL ob)
{
CL temp;
temp.c=ob.c+i;
return temp;
}