- •1 Парадигми та мови програмування
- •1.1 Процедурне програмування
- •1.2 Об'єктне (модульне) програмування
- •1.3 Об'єктно-орієнтовне програмування
- •2 Програмне середовище
- •3 Базові поняття програмування
- •4 Процедурно-орієнтоване програмування
- •4.1 Функції
- •4.2 Вбудовані (inline) функції
- •4.3 Передача параметрів
- •4.4 Обчислення значення функцій
- •4.4. Обчислення значення функції — вихід із функції; особливості повернення та використання іменованого значення, іменованої константи
- •4.5 Рекурсія
- •4.6 Довизначення (overloading) функцій
- •4.6. Довизначення (overloading) функцій
- •4.7 Узагальнені функції (function template)
- •4.8 Непряме використання функцій: указники на функції, їх тип, ініціалізація і присвоєння
- •4.9 Видимість
- •4.10 Тривалість життя об’єктів
- •5 Об'єктне програмування
- •5.1 Класи і об'єкти, члени класів
- •5.2 Інтерфейс класу, реалізація класу; визначення і оголошення класу
- •5.3 Створення і ініціалізація об'єктів, довизначення конструкторів, замовчуваний конструктор, копіювання, поверхневе і глибоке копіювання, ініціалізація і присвоєння, копіювальний конструктор
- •5.4 Cтатичні члени класів і статичні класні функції
- •5.5 Константні об'єкти, константні функції, змінювані члени константних об'єктів (mutable)
- •5.6 Поточний об'єкт this, указники на члени класу і класні функції, порівняння з указниками на (позакласні) функції, указники на статичні члени класу
- •5.7 5.8. Довизначення (overloading) операцій
- •5.7 5.8. Довизначення (overloading) операцій
- •5.7 5.8. Довизначення (overloading) операцій
- •5.7 5.8. Довизначення (overloading) операцій
- •5.7 5.8. Довизначення (overloading) операцій
- •5.7 5.8. Довизначення (overloading) операцій
- •5.8 Клас string: конструктори і присвоєння рядків, операції, відкладене копіювання
- •5.9 Параметризовані класи (class template): визначення шаблону, конкретизація
- •6 Об'єктно-орієнтовне програмування
- •6.1 Ієрархія об’єктів і ієрархія класів
- •6.2 Відкрите, закрите і захищене успадкування, успадкування типу і успадкування реалізації; абстрактні класи
- •6.3 Створення похідних об'єктів
- •6.4 Статичне і динамічне зв’язування
- •6.5 Успадкування із спільного базового класу. Кратне (multiple) успадкування. Віртуальне успадкування, порядок виклику конструкторів
- •7 Екзаменаційні завдання
- •7 Екзаменаційні завдання
5.7 5.8. Довизначення (overloading) операцій
Зверніть увагу на сигнатуру і реалізацію постфіксних операторів інкременту
і декременту. Чому вони відрізняються від префіксних?
Ось приклади викликів
PtrToTime::PtrToTime(Time *v, int s):
array(v),
current(v),
size(s)
{
}
Time* PtrToTime::operator->()
{
return current;
}
Time& PtrToTime::operator* ()
{
return *current;
}
Time& PtrToTime::operator[](int i)
{
if ((i<0) || (i>=size))
throw BadIndex();
return current[i];
}
PtrToTime& PtrToTime::operator++()
{
if (current+1>array+size)
throw BadIndex();
current++;
return *this;
}
PtrToTime PtrToTime::operator++(int)
{
if (current+1>array+size)
throw BadIndex();
PtrToTime temp=*this;
current++; return temp;
}
PtrToTime& PtrToTime::operator--()
{
if (current-1<array)
throw BadIndex();
current--;
return *this;
}
PtrToTime PtrToTime::operator--(int)
{
if (current-1<array)
throw BadIndex();
PtrToTime temp=*this;
current--;
return temp;
}
Ось приклади викликів
int main()
{
Time firstTime( 1, 10, 50 );
Time secondTime( 2, 24, 20 );
Time sumTime =firstTime+secondTime;
Time ar[] = {firstTime, secondTime, sumTime};
PtrToTime t(ar, 3);
cout<<"0) ";
(t[0]).display();
cout<<"1) ";
(t[1]).display();
cout<<"2) ";
(t[2]).display();
*t++=Time(2,30,25);
cout<<"0) ";
(t[0]).display();
cout<<"1) ";
(t[1]).display();
cout<<"2) ";
(t[2]).display();
t--;
(t++)->display();
(*t).display();
(++t)->display();
(*t).display();
(t--)->display();
(*t).display();
(--t)->display();
(*t).display();
return 0;
}
Тепер ще одне заключне зауваження стосовне довизначення операцій. Деякі з
операцій, наприклад, арифметичні, можна довизначати як всередині класу, так
і зовні за допомогою утиліт. Інші завжди потребують доступу до об'єкту this
і тому можуть бути лише членами класу. Нарешті розглянемо випадок, коли нам
доведеться завжди створювати утиліту класу. Так поступають у випадках, коли
специфікація класу недоступна для модифікації.
Розглянемо довизначення операцій вводу та виводу відповідно з класів вхідного
istream та вихідного ostream потоків. Повернемося до класу
class MenuItem
{
private:
float price;
string name;
public:
MenuItem();
MenuItem( float, string);
MenuItem( float, char[]);
MenuItem(const MenuItem&);
void setName(char*);
string getName();
void setPrice(float);
float getPrice(){return price;};
operator float(){return price;};
float operator+(const MenuItem&);
float operator+(float);
};
Ось операції вводу >> та виводу <<
#include
using namespace std;
istream &operator>>(istream &is, MenuItem &item)
{
float itemPrice;
char itemName[ kMaxNameLength ];
is.getline(itemName, kMaxNameLength);
item.setName(itemName);
is >> itemPrice;
item.setPrice(itemPrice);
is.ignore(1, '\n');
return( is );
}
ostream &operator<<(ostream &os, MenuItem &item)
{
os << item.getName().c_str()
<<" (UAH "<< item.getPrice()<< ")";
return(os);
}
В операторі вводу тут вжито елементи форматування, деталі якого можна знайти
в заголовному файлі iostream . Наступний приклад показує застосування цих операцій
для вводу даних з файлу
#include <fstream>
using namespace std;
int main()
{
ifstream readMe("DayMenu.txt");
MenuItem item;
while (readMe >> item)
cout << item << "\n";
return 0;
}
А ось приклад заповнення файлу DayMenu.txt , відповідний запропонованому формату
вводу
Salad of season
1.99
Beef Stroganoff
9.99
Espresso
2.99
