{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().