
- •Введение в понятие класса
- •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 queue::init(void)
{
sloc=rloc=0;
}
Это определение функции init() класса queue. Операция :: называется операцией принадлежности (scope resolution). Она определяет к какому классу принадлежит эта функция. Имя queue::init - полное или квалифицированное имя функции-члена класса.
В С++ разные классы могут иметь функции с одинаковыми именами. Операция :: и имя класса позволяют компилятору определить принадлежность функции.
Чтобы вызвать функцию-член класса в той части программы, которая не является частью класса, надо использовать имя объекта и операцию “.” доступа к члену (элементу) класса. Например
queue a,b; // два объекта класса queue
тогда a.init(); // вызов функции init() для объекта класса queue
В данном случае a и b два разных объекта. Данные – члены этих объектов занимают в памяти разное место, но функции-члены класса – общие. Функции-члены класса для того, чтобы отличать один объект от другого, имеют неявный параметр, указатель на объект. Этот указатель называется this
Замечание Функция-член класса может вызывать другую функцию-член того же класса или использовать данные-члены класса непосредственно, не использую операцию “.”. Операцию “.” надо использовать только тогда, когда функция-член класса вызывается в функциях, не являющихся членами класса (nomember functions).
Пример
// Модель - очередь
#include <iostream.h>
#include <conio.h>
class queue {
int q[10];
int sloc,rloc;
public:
void init(void); // прототип
void qput(int); // прототип
int qget(void); // прототип
};
void queue::init(void) // объявление функций-членов класса
{
rloc=sloc=0;
}
int queue::qget(void) {
if (sloc==rloc)
{
cout<<"\n Очередь пустая";
return 0;
}
return q[rloc++];
}
void queue::qput(int i) {
if (sloc==10)
{
cout<<"\n Очередь полная";
return;
}
q[sloc++]=i; }
main(void)
{/
queue a,b; // Создание двух объектов
a.init(); // Инициализация объекта a
b.init(); // Инициализация объекта b
a.qput(7);
a.qput(9);
a.qput(11);
cout<<a.qget()<<" ";
cout<<a.qget()<<" ";
cout<<a.qget()<<" ";
cout<<a.qget()<<"\n";
for(int i=0;i<12;i++)
b.qput(i*i);
for(i=0;i<12;i++)
cout<<b.qget()<<" ";
cout<<"\n\n";
getch();
return 0;
}
Перегруженные функции
Одним из путей реализации полиморфизма в языке С++ является перегрузка функций. Две или более функций могут иметь одно и тоже имя, но отличаться друг от друга количеством или типом параметров. Тогда говорят о перегруженных функциях (overload functions).
Пример
#include <iostream.h>
// overload functions
Int sqr_it(int I); // Прототипы
double sqr_it(double d); // функций
long sqr_it(long l); // с различными параметрами
main(void) {
int i=7; double d=1.1; long l=20;
cout<<sqr_it(i)<<"\n"; // вызов
cout<<sqr_it(d)<<"\n"; // с переменными
cout<<sqr_it(l)<<"\n";
cout<<sqr_it(10)<<"\n"; // вызов с константами
cout<<sqr_it(10.1)<<"\n";
cout<<sqr_it(70000)<<"\n";
cout<<sqr_it(101)<<"\n";
unsigned u=4;
// cout<<sqr_it(u)<<"\n"; // Некорректный параметр --> ошибка!!!
return 0;
}
int sqr_it(int i) {
cout<<"\n Функция с целочисленным аргументом ";
return i*i;
}
double sqr_it(double d) {
cout<<"\n Функция с вещественным удвоенной точности ";
return d*d;
}
long sqr_it(long l) {
cout<<"\n Функция с вещественным удвоенной точности (длинным 10 байт) ";
return l*l;
}
Перегрузка функций позволяет использовать одно и тоже имя для выполнения одинаковых или похожих действий с аргументами.
В С есть функции atoi(), atof(), atol(), которые преобразуют строку цифр во внутренний формат представления чисел, соответственно, int, double, long double. Каждое из них выполняет почти идентичные действия.
В С++ возможно использование одного имени atonum() для всех трех функций. Способ преобразования будет выбираться в зависимости от типа аргумента функции atonum().