Всего на сайте:
210 тыс. 306 статей

Главная | Механика

Покажчик this  Просмотрен 463

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

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

7.5.3. Перевантаження функцій-членів.

Предыдущая статья:Extern C. {#include<stdio.h>} Це приведе до того, що всі прототипи функці.. Следующая статья:Void SeTime(int phour,int pminute);
page speed (0.0121 sec, direct)