- •Введение в понятие класса
- •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)
Ключевое слово this
При вызове функции-члена класса передается еще один неявный параметр – указатель на объект класса, который вызывает данную функцию. Этот указатель называется this. Это ключевое слово, в частности, используется при перегрузке операций. В общем случае функции-члены класса могут иметь доступ к приватным элементам класса. Например
class c1{
int i;
….
};
Для данного класса функция – член класса может иметь оператор присваивания i=10; В действительности этот оператор является короткой записью оператора
this->i=10; Чтобы понять как работает оператор this рассмотрим короткую программу
#include <iostream.h>
сlass c1{
int i;
public:
void load_i(int val) { this->i=val;} // аналогично i=val
int get_i(void) { return this->i; } // аналогично return I;
};
void main(void)
{
c1 c;
c.load_i(100);
cout<<c.get_(i);
}
На экран программа выводит число 100.
Рассмотрим дополнительно программу, содержащие перегрузку операции !
#include <string.h>
#include <stdio.h>
const int MAX_LEN = 100;
class Name
{
char data[MAX_LEN];
public:
Name();
void SetData(char *newData);
int operator!();
};
// конструктор – инициализация нулями
Name::Name()
{
memset (data, ‘\0’ , sizeof(data) );
}
// сохранить специфицированное имя
void Name::SetData(char *newData)
{
strcpy(data, newData);
}
// перегрузка операции !() показывает , имеются ли данные
int Name::operator!()
{
return (data[0] = = ‘\0’)
}
void main(void)
{
Name name;
if(!name) // неявный вызов operator !()
name.SetData(“ Тестирование программы”);
// теперь явный вызов функции operator!()
if(!name.operator!())
printf(“Данные присвоены ….\n”);
}
Перегрузка операций ввода/вывода. Инсерторы и экстракторы
Для организации ввода/вывода данных, связанных с классом, строится специальная функция – член класса, целью которой является ввод и вывод данных этого класса. Достигается это путем перегрузки операций >> и <<.
Операция << в англоязычной литературе обычно называется inserting (вставка данных в поток), а операция >> - extracting (извлечение данных из потока).
Функции – члены класса, обеспечивающие перегрузку операций <<, мы будем называть инсертором (insertor), а функцию, соответствующую перегрузке операции >>. Будем называть экстрактором (extractor). В качестве примера создания функции инсертора рассмотрим класс vector:
class vector{
public:
int x, y, z;
vector (int a, int b, int c) { x=a; y=b; z=c;}
}
Чтобы создать функцию-инсертор для этого класса, мы должны определить операцию ввода относительно этого класса, т. е. перегрузить операцию <<.
// vector инсертор
ostream &operator <<(ostream &stream, vector obj)
{
stream << obj.x<<”, “;
stream << obj.y<<”, “;
stream <<obj.z<<”\n”;
return stream:
}
Возвращаемый тип этой функции – ostream. Это необходимое условие для того, чтобы можно было использовать инсертор этого типа в одном потоке вывода.
Функция имеет два параметра: ссылку на поток, который находится слева от знака операции <<, и объект, который находится справа от знака операции, данные этого объекта и будут выводиться.
Затем следует выдача трех значений членов объектов класса vector и возвращается поток stream. Возвращение потока обязательно.
Пример работы инсертора:
#include <iostream.h>
class vector{
public:
int x, y, z;
vector (int a, int b, int c) { x=a; y=b; z=c;}
}
// vector инсертор
ostream &operator <<(ostream &stream, vector obj)
{
stream << obj.x<<”, “;
stream << obj.y<<”, “;
stream <<obj.z<<”\n”;
return stream:
}