- •1. Объектно-ориентированное программирование как методология проектирования программных средств.
- •1.2. Объект
- •Iarray a(10), b(25), c(45);
- •Int main(void)
- •2.1. Перегрузка имен функций
- •Int print(int);
- •Void print(int);
- •Int (*matrix)[10];
- •Void main(void)
- •Void incr(int &aa)
- •3.2 Объявление класса.
- •Имя_класса имя объекта;
- •Имя объекта. Имя элемента
- •Имя_объекта. Имя_метода( );
- •Имя класса *this;
- •Имя_класса (список формальных параметров)
- •Листинг 3.4
- •V_3d( double &X, double &y,double &z)
- •Void main(void)
- •Х:: х(const х&)
- •V_3d::v_3d(const v_3d& v1)
- •Void v_3d::print()
- •Сlass X
- •Void main (void)
- •4. Перегрузка операций
- •V_3d(double x1,double y1,double z1)
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.1. Использование дружественных функций при перегрузке операций
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.2.Особенности использования дружественных функций
- •Имя объекта. Имя_функции
- •Void f1( X& );
- •Void f2 ( X* );
- •Void main(void)
- •5. Производные классы
- •Int Bfunc( );
- •Int Xfunc( );
- •Int Efunc( X & x1 );
- •Istream
- •Iostream
- •Ifstream
- •С помощью манипуляторов – специальных операций, вставляемых непосредственно в поток вывода.
- •Int width( int w);
- •Int precision( int p);
- •Void main(void)
- •Void open(char* filename, int mode, int access);
- •If(!fout) {
- •7. Виртуальные функции
- •Circle a;
- •A.Build();
- •Virtual double a(double X)
- •Void main (void)
- •Void Graphics Object :: Build() { };
- •8.Шаблоны функций и классов
- •Void main(void)
- •Void Swap ( SwapType &X, SwapType &y)
- •Void main(void)
- •Int a, double b;
- •Int sloc,rloc;//начало и конец очереди
- •Void qput(t I); // помещение элемента в очередь
- •Int main(void)
- •1.Какой принцип ооп реализуется с помощью шаблонных функций и классов?
- •2.Когда целесообразно использовать шаблоны функций? Каков общий вид объявления шаблона функции?
4.3.2.Особенности использования дружественных функций
Дружественная функция при вызове не получает указателя this. Объекты классов должны передаваться дружественной функции только явно через аппарат параметров. При вызове дружественной функции нельзя использовать синтаксис вызова функций – методов класса:
Имя объекта. Имя_функции
и
указатель_на_объект ->имя_функции,
так как дружественная функция не является методом класса. Именно поэтому на дружественную функцию не распространяется и действие спецификаторов доступа (public, private, protected). Место размещения прототипа дружественной функции внутри определения класса безразлично. Права доступа дружественной функции не изменяются и не зависят от спецификаторов доступа.
Использование механизма дружественных функций позволяет упростить интерфейс между классами. Например, можно сделать все функции класса Y друзьями класса X в одном объявлении, например:
class Y
{.....
Void f1( X& );
Void f2 ( X* );
.....
};
class X
{
friend Y; // все функции класса Y являются друзьями класса X
int i;
void f3 ( ); // функции f1 и f2 класса Y являются друзьями класса X
// и имеют доступ к private элементам i и f3 класса X
};
4.4. Перегрузка операций >>и << для ввода-вывода встроенных типов
В файле <iostream.h> определены классы ostream и istream, в которых объявлены функции-операторы как методы классов, перегружающие действие побитовых операций >> и << для организации неформатированного ввода и вывода данных базовых типов языка С++.
Класс istream определен как:
class istream
{
// .....
public:
istream & operator >> ( char * ); //символьная строка
istream & operator >> ( char & ); //символ
istream & operator >> (short & );
istream & operator >> ( int & );
istream & operator >> ( long & );
istream & operator >> ( float & );
istream & operator >> (double &);
// …
}
Класс ostream определен как:
class ostream
{
//.....
public:
ostream & operator << ( char * );
ostream & operator << ( int );
ostream & operator << ( long );
ostream & operator << ( double );
ostream & put ( char * );
}
Такая перегрузка операций позволяет программисту организовывать ввод типов данных базовых типов единообразно. В зависимости от типа данного компилятор связывает вызов функции-оператора с соответствующим определением.
4.5. Перегрузка операций >> и << для ввода, вывода типов, объявленных пользователем
Очень полезным примером применения механизма перегрузки операций и функций-друзей классов является использование операций >> и << для ввода, вывода типов, объявленных пользователем. . В качестве примера в листинге 4.3 приведена модифицированная версия программы из листинга 4.2, в которой операции >> и << перегружены с помощью дружественных функций.
Листинг 4.3
#include <iostream.h>
class V_3d
{
int x,y,z;
public:
//конструктор по умолчанию
V_3d(){x=0;y=0;z=0;};
//конструктор, принимающий параметры
V_3d(int x1,int y1,int z1)
{
x=x1;y=y1;z=z1;
};
//функция друг для вывода вектора
friend ostream &operator <<(ostream &stream, V_3d obj);
//функция друг для ввода вектора
friend istream &operator >>(istream &stream, V_3d &obj);
// функция-друг для перегрузки +
friend V_3d operator +(V_3d op1, V_3d op2);
// функция-друг для перегрузки ++
friend V_3d operator ++(V_3d &op1);
// функция для перегрузки =
V_3d operator =( V_3d t);
};
