Inline int x::readm(void)

{return m;}

У цьому прикладі код функції readm вставлятиметься безпосередньо в місце її виклику. Очевидно, що це приведе до зростання швидкодії програми. Розглянутий приклад абсолютно аналогічний ситуації, коли тіло функції розміщується в межах формального опису класу:

Class x

{int m;

public:

Int readm(void)

{return m;}};

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

Компілятор з високим рівнем оптимізації може у випадках, коли тіло функції містить багато операторів, не вставляти код програми в місце її виклику, якщо навіть присутній специфікатор inline.

Покажчик this

Як уже зазначалось, у тілі функції-члена оператори мають безпосередній доступ до будь-яких полів даних і функцій-членів, визначених у протоколі. Часто в протоколі опису класу виникає необхідність викликати функцію-член усередині іншої функції-члена. Якщо послідовно дотримуватись ООП, то вкладений виклик функції має інтерпретуватися як передавання повідомлення об'єкту. Об'єкт, що приймає вкладене повідомлення – це той самий об'єкт, який приймає повідомлення верхнього рівня, тобто він має "вміти" передавати повідомлення сам собі. Як вийти з цієї ситуації, щоб повністю підтримувалась концепція ООП? Розв'язується ця проблема таким чином. У С++ будь-яка функція-член класу має додатковий скритий формальний параметр – покажчик на клас, для екземпляра якого викликається функція-член. Причому він завжди ініціалізується системою С++ так, що вказує на об'єкт, для якого викликається функція-член. Іншими словами, будь-яка функція-член класу Х у сигнатурі містить неявне оголошення вигляду

X *this;

Цікаво, що this є ключовим словом. Звідси випливає, що покажчик this не може бути описаним явно. З іншого боку, до покажчика this можна звертатись явно в тілі функції-члена. Розглянемо, наприклад, клас

class Х{

int m;

public:

int readm(void){return m;}};

Функцію-член readm () можна записати й так:

int readm(void){return this->m;}

Обидві форми запису еквівалентні. Використання this у другому випадку зайве. При звертанні до полів даних у протоколі опису не обов'язково використовувати this. Проте в деяких випадках використання цього покажчика може бути корисним. Це стосується функцій, які працюють з покажчиками. Розглянемо функцію, яка вставляє елемент у двозв'язний список:

class dlink {

dlink*pre

dlink*suc;

public:

void append(dlink*);};

void dlink::append(dlink*p);

{p->suc=suc;//тобто p->suc=this->suc;

p->pre=this;

suc->pre=p;//тобто this->suc->pre=p

suc=p;}

У такій реалізації функція append() вставляє елемент, покажчик на який передається як параметр у функцію, після елемента, який викликав функцію-член append().


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: