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

Int mainO

{

cFunO;

getchO; return 0;

}

  1. Ця функція буде скомпонована як С-функція. void cFunO {

cout«"Ця функція скомпонована як С-функція"« endl;

Нео! хгдноапам' ятати! Ключове слово ЄХІЄГП - необхідна складова специфіка­ції компонування. Понад це, специфікація компонування повинна бути глобаль­ною; її не можна використовувати в тілі якої-небудь функції.

Використовуючи наступний формат специфікації компонування, можна зада­ти не одну, а відразу декілька функцій, extern "Moeä' {

прототипи_фунщй

}

Специфікації компонування використовуються досить рідко, і Вам, можливо, ніколи не доведеться їх застосовувати. Основне їх призначення - дати змогу зас­тосування у С++-програмах кодів програм, написаних іншими організаціями мо­вами, відмінними від мови C++.

  1. Оператори вказання на члени класу і

У мові програмування C++ передбачено можливість згенерувати покажчик спеціального типу, який "посилається" не на конкретний примірник члена в об'єк­ті, а на члена класу взагалі. Покажчик такого типу називається покажчиком на члена класу (pointer-to-member). Це - не звичайний С++-покажчик. Цей спеціаль­ний покажчик забезпечує тільки відповідний зсув у об'єкті, який дає змогу вияви­ти потрібного члена класу. Оскільки покажчики на члени - не справжні покажчи­ки, то до них не можна застосовувати оператори "." і Для отримання доступу до члена класу через покажчик на член необхідно використовувати спеціальні оператори і

Оператори вказання на члени класу дають змогу отримати доступ до члена класу через покажчик на цього члена.

Якщо ідея, яку викладено у попередньому абзаці, Вам видалася трохи "неви­разною", то наведений нижче приклад допоможе її з'ясувати. У процесі виконання цієї програми відображається сума чисел від 1 до 7. Тут доступ до членів класу туСІаз5(функції Sum() і змінної sum) реалізується шляхом використання покажчиків на члени.

Код програми 11.17. Демонстрація механізму використання покажчиків на члени класу (початкова версія)

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class myClass {// Оголошення класового типу public:

int sum;

void myClass::Sum(int x);

};

void myClass::Sum(int x)

{

sum = 0;

for(int i=x; i; i~) sum += i;

}

Int mainO

{

Int myClass::*dp; // Покажчик на int-члена класу void (myClass::*fp)(int X); // Покажчик на функцію-члена

myClass ObjC;

dp = myClass::sum; // Отримуємо адресу члена даних fp = &myClass::Sum; // Отримуємо адресу функції-члена класу

(ObjC*fj3)(7); // Обчислюємо суму чисел від 1 до 7 cout«"Сума чисел від 1 до 7 дорівнює"« ObjC.*dp;

getchO; return 0;

}

Результат виконання цієї програми є таким:

Сума чисел від 1 до 7 дорівнює 28

У функції main() створюється два члени-покажчики: dp (для вказівки на змін­ну sum) і fp (для вказівки на функцію SumO). Зверніть увагу на синтаксис кожного оголошення. Для уточнення класу використовують оператор дозволу контексту (оператор дозволу області видимості). Програма також створює об'єкт типу myClass з іменем ObjC.

Потім програма отримує адреси змінної sum і функції Sum() і присвоює їх по­кажчикам відповідно dp і fjD. Як уже зазначалося вище, ці адреси насправді є тільки зсувами в об'єкті типу myClass, згідно з якими можна знайти змінну sum і функцію Sum(). Потім програма використовує покажчик на функцію fp, щоб викликати фун­кцію Sum() для об'єкта ObjC. Наявність додаткових круглих дужок пояснюється не­обхідністю коректного застосування оператора Нарешті, програма відображає значення суми чисел, отримуючи доступ до змінної sum об'єкта ObjC через покаж­чик dp.

Під час доступу до члена об'єкта за допомогою об'єкта або посилання на ньо­го необхідно використовувати оператор Але, якщо для цього використо­вується покажчик на об'єкт, то потрібно використовувати оператор як пока­зано у цій версії попереднього коду програми.

Код програми 11.18. Демонстрація механізму використання покажчиків на члени класу (модифікована версія)

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class myClass {// Оголошення класового типу public:

int sum;

void myClass::Sum(int x);

};

void myClass::Sum(int x)

{

sum = 0;

for(int і=х; і; і--) sum += і;

int mainO

int myCiass::*dp; // Покажчик на int-члена класу void (myClass::*fp)(int х); // Покажчик на функцію-члена myClass *с, ObjD; // Член с зараз -- покажчик на об'єкт

с = &ObjD;

dp = &myClass::sum;

fp = &myClass::Sum;

// Присвоюємо покажчику с адресу об'єкта // Отримуємо адресу члена даних sum // Отримуємо адресу функції SumQ

(c->*fp)(7); //Тепер використовуємо оператор для виклику функції SumQ.

cout«"Сума чисел від 1 до 7 дорівнює" « c->*dp; // ->* getchQ; return 0;

У цій версії змінна с оголошується як покажчик на об'єкт типу myClass, а для доступу до члена даних sum і функції-члена Sum() використовують оператор

Нео! хідноапам ятати! Оператори вказання на члени класу призначені для спеціальних випадків, тому їх не варто використовувати для розв'язання зви­чайних повсякденних задач програмування.

  1. Створення функцій перетворення типів

Іноді виникає потреба в одному виразі об'єднати створений програмістом клас з даними інших типів. Хоча перевизначені операторні функції можуть забез­печити використання змішаних типів даних, у деяких випадках все ж таки можна обійтися простим перетворенням типів. І тоді, щоб перетворити клас у тип, суміс­ний з типом решти частини виразу, потрібно використовувати функцію перетво­рення типу. Загальний формат функції перетворення типу має такий вигляд:

operator typeO {return value',}

У цьому записі елемент type - новий тип, який є метою нашого перетворення, а елемент value - значення після перетворення. Функція перетворення повинна бути членом класу, для якого вона визначається.

Функція перетворення автоматично перетворить тип класу в інший

тип.

Щоб проілюструвати створення функцій перетворення, скористаємося кла­сом kooClass ще раз. Припустимо, що нам потрібно мати засіб перетворення об'єк­та типу kooClass у цілочисельне значення, яке можна використовувати в цілочи- сельному виразі. Понад це, таке перетворення повинно відбуватися з використан­ням добутку значень трьох координат. Для реалізації цього будемо використову­вати функцію перетворення, яка має такий вигляд: operator intQ {return х * у * z;}

Тепер розглянемо код програми, яка ілюструє роботу функції перетворення.

Код програми 11.19. Демонстрація механізму використання функції перетворення типів #include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

class kooClass {// Оголошення класового типу int х, у, z; // Тривимірні координати public:

kooClass(int a, int b, int c) {x = а; у = b; z = c;} kooClass operator+(kooClass obj);

friend ostream &operator«(ostream &stream, kooClass &obj); operator int() {return x * у * z;}

};

// Відображення тривимірних координат x, у, z - функція виведення даних // для класу kooClass.

ostream &operator«(ostream &stream, kooClass &obj)

{

stream « obj.x «", stream « obj.y «", stream « obj.z « endl;

return stream; // Повертає посилання на параметр stream

}

kooClass kooClass: :operator+(kooClass obj)

{

kooClass tmp(0,0,0);

tmp.x = x + obj.x; tmp.y = у + obj.y; tmp.z = z + obj.z;

return tmp; // Повертає модифікований тимчасовий об'єкт

}