- •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.Когда целесообразно использовать шаблоны функций? Каков общий вид объявления шаблона функции?
Void main(void)
{
//создание обьектов а, b, d, s класса V_3d
V_3d a;
V_3d b;
V_3d d,s;
cout << " Введите координаты x,y,z вектора a: \n";
cin >> a;
cout << "координаты вектора a:\n";
cout << a;
cout << " Введите координаты x,y,z вектора b: \n";
cin >> b;
cout << "координаты вектора b:\n";
cout << b;
d=a+b; //демонстрация перегруженной операции сложения векторов a и b
cout << "\n сумма векторов a и b :\n";
cout << d;
s=a; // демонстрация перегруженной операции присваивания
cout << "\n координаты вектора s\n";
++s;
cout << s;
cout << "\n координаты вектора s после увеличения на 1\n";
cout << s;
}
// определение функции друга для вывода вектора
ostream &operator <<(ostream &stream, V_3d obj)
{
stream << "x=" << obj.x <<", " ;
stream << "y=" << obj.y <<", " ;
stream << "z=" << obj.z <<"\n" ;
return stream; //возврат потока
}
//определение функции друга для ввода вектора
istream &operator >>(istream &stream, V_3d &obj)
{
stream >> obj.x >> obj.y >> obj.z;
return stream;
}
// определение дружественной функции - оператора +
V_3d operator +(V_3d op1,V_3d op2)
{
V_3d c;
c.x=op1.x+op2.x;
c.y=op1.y+op2.y;
c.z=op1.z+op2.z;
return c;
}
// определение дружественной функции - оператора ++
V_3d operator ++(V_3d &op1)
{
op1.x++;
op1.y++;
op1.z++;
return op1;
}
// определение функции - оператора=
V_3d V_3d::operator =(V_3d t)
{
x=t.x;
y=t.y;
z=t.z;
return *this;
}
В этой программе следует обратить внимание на то, что в качестве возвращаемых значений функций, перегружающих операции >> и << объявлены ссылки на потоки ввода и вывода соответственно. Это необходимо, чтобы в одном операторе можно было записать несколько операций извлечения и вставки. Далее, функции имеют два параметра. Первым служит ссылка на поток, который присутствует в левой части операций >> и <<, а вторым параметром служит объект с правой стороны этих операций.
Перегруженные функции operator >> и operator << не являются методами класса V_3d, это функции-друзья класса. Действительно, ни функция вставки, ни функция извлечения не могут быть методами класса. Причина заключается в том, что если функция-оператор является методом класса, то левым операндом, неявно передаваемым с использованием указателя this служит объект того класса, который осуществляет вызов функции-оператора. И нет способа изменить такой порядок. Левым же аргументом функций операторов, перегружающих операции >> и <<является ссылка на потоки ввода или вывода, которые не принадлежат классу, создаваемому пользователем в программе. Поэтому перегруженные функции операторы operator >> и operator << не могут быть методами класса, созданного пользователем. Это позволяет сохранить неизменным принцип инкапсуляции ООП.
Контрольные вопросы
1.Каким образом осуществляется перегрузка операций в С++?
2.Каков синтаксис объявления оператора – функции?
3.Каков механизм передачи параметров оператору – функции при перегрузке бинарных операций?
4.Почему при перегрузке унарных операций оператор-функция не имеет параметров?
5.Какая функция называется другом класса?
6.В чем особенности передачи параметров дружественной функции при перегрузке унарных и бинарных операций?
7. Как выполняется перегрузка операций >> и << для ввода и вывода встроенных типов языка?
8. Как выполняется перегрузка операций >> и << для ввода и вывода типов, объявленных пользователем?
