Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мищишин електронка.doc
Скачиваний:
1
Добавлен:
08.12.2018
Размер:
1.04 Mб
Скачать

Void main(void)

{

for (int i = 1; i <= 10; i++)

cout << "Для" << i << "куб рівний " << ((i)*(i)*(i)) << endl;

}

Зверніть увагу, що попередня макрокоманда помістила параметр х всередину круглих дужок, використавши запис ((x)*(x)*(x)) замість (х*х*x). При створенні макрокоманд, щоб бути впевненим, що C++ потрактує ваші вирази саме так, як ви хочете, потрібно враховувати пріоритет виконання арифметичних операцій і використовувати круглі дужки, як показано вище.

Чим відрізняються макрокоманди від функцій ?

Макрокоманда не є функцією. Якщо використовувати функцію, то у виконувану програму поміщається тільки одна копія операторів функції. Кожного разу при виклику функції компілятор поміщає параметри в стек і потім виконує перехід до тіла функції. Після завершення функції програма видаляє параметри зі стека і переходить назад до оператора, що слідує безпосередньо за викликом функції.

У випадку з макрокомандою препроцесор замінює у тексті програми кожне посилання на макрокоманду відповідним виразом макрокоманди. Наприклад, якщо попередня програма використовує макрокоманду CUBE в 100 різних місцях, препроцесор підставить вираз макрокоманди 100 разів. Використовуючи макрокоманди, ви уникаєте витрат на виклик функції (витрат на розміщення параметрів в стек і видалення їх звідти, а також витрат на виконання переходу до операторів функції і повернення від них). Це відбувається завдяки тому, що у випадку з макрокомандою препроцесор вбудовує в тіло програми відповідні оператори. Проте, оскільки препроцесор замінює кожне посилання на макрокоманду відповідним виразом, макрокоманди збільшують розмір виконуваної програми.

Використовування макрокоманд надає велику гнучкість програмам

Макрокоманди широко використовуються з метою спрощення і поліпшення сприйняття тексту самої програми. MACDELAY.CPP ілюструє, крім того, і гнучкість макрокоманд. Програма допомагає також уявити, як препроцесор замінює ім'я макрокоманди відповідними операторами:

_

#define delay(x) { \

cout << "Затримка на " << x << endl; \

for(long int i=0; i < x; i++) \

; \

}

Void main(void)

{

delay(100000L);

delay(200000L);

delay(300000L);

}

В даному випадку, оскільки визначення макрокоманди займає декілька рядків, то в кінці кожного рядка, що має продовження, поміщають один символ зворотного слеша (\). Коли препроцесор зустріне посилання на макрокоманду, він замінить це посилання операторами, які з'являються у визначенні макрокоманди.

38. Поліморфізм

Загалом поліморфізм є здатністю об'єкту змінювати форму під час виконання програми. C++ спрощує створення поліморфних об'єктів використовуючи віртуальні (virtual) функції.

Припустимо, що програма PHONEONE.CPP використовує клас phone для створення об'єкту-телефону [1]:

class phone {

public:

void dial (char *number) { cout << "набір номера "

<< number << endl; }

void answer(void) { cout << "Очікування відповіді" << endl; }

void hangup(void){ cout << "Дзвінок виконано-покласти слухавку"

<< endl; }

void ring(void) { cout << "дзвінок, дзвінок, дзвінок"

<< endl; }

phone(char <<*number) { strcpy(phone::number, number); };

private:

char number[13];