68947

Вказівники на члени класу

Лекция

Информатика, кибернетика и программирование

Вказівник такого вигляду називається вказівником на член класу. Цей незвичайний вказівник задає зсув усередині об’єкту відповідного класу. Оскільки вказівники на члени класу не є вказівниками в звичайному сенсі слова до них не можна застосовувати операторів.

Украинкский

2014-09-27

32 KB

2 чел.

Лекція № 9

Тема: Вказівники на члени класу

У мові C++ існує особливий тип вказівника, який посилається на член класу взагалі, а не на конкретний екземпляр цього члена в об'єкті. Вказівник такого вигляду називається вказівником на член класу. Цей незвичайний вказівник задає зсув усередині об'єкту відповідного класу. Оскільки вказівники на члени класу не є вказівниками в звичайному сенсі слова, до них не можна застосовувати операторів "." і "->". Щоб звернутися до члена класу за допомогою вказівника на нього, слід застосовувати особливих операторів: ".*" і "->*". Розглянемо приклад.

#include <iostream>

using namespace std;

class cl {

public:

cl(int i) { val=i; }

int val;

int double_val() { return val+val; }

};

int main()

{

int cl::*data; // Вказівник на член класу

int (cl::*func)(); // Вказівник на функцию-член

cl obl(l), ob2(2); // Створюємо об'єкти

data = &cl::val; // Визначуваний зсув члена val

func = &cl::double_val; // Визначуваний зсув функції double_val()

cout « "Значення: ";

cout « obl.*data « " " « ob2. *data « "\n",-

cout « "Подвоєні значення: "; cout « (obl.*func)() « " "; cout « (ob2.*func)() « "\n";

return 0;

}

Ця програма створює два вказівники на члени класу: data і func. Звернете особливу увагу на синтаксичні особливості їх оголошень. Оголошуючи вказівники на члени, слід задавати ім'я класу і застосовувати оператора дозволу області видимості. Крім того, програма створює два об'єкти класу cl: obi і оЬ2. Вказівники на члени класу можуть посилатися як на змінні, так і на члени. Потім обчислюються адреси членів val і double_val (). Ці "адреси" є зсуви відповідних членів в об'єкті класу cl. Значення, що зберігаються в змінній val в кожному з об'єктів, виводяться на екран за допомогою вказівника data. На закінчення програма викликає функцію double_func (), використовуючи змінну func, що є вказівником на член класу. Звернете увагу на те, що для правильного виконання оператора ".*" необхідні додаткові дужки.

Для доступу до члена класу через об'єкт або посилання на нього використовується оператор ".*". Якщо заданий вказівник на об'єкт, для доступу до його членів необхідно застосовувати оператора "->*". Проілюструємо сказане наступним прикладом.

#include <iostream>

using namespace std;

class cl {

public:

cl(int i) { val=i; }

int val;

int double_val() { return val+val; }

};

int main() {

int cl::*data; // Вказівник на переменную-член

int (cl::*func)(); // Вказівник на функцию-член

cl obl(l), ob2(2); // Створюємо об'єкти

cl *pl, *р2;

pi = &оЫ; // Доступ до об'єкту через вказівник р2 = &оЬ2;

data = &cl::val; // Визначуваний зсув змінної val

func = &cl::double_val; // Визначуваний зсув функції double_val()

cout << "Значення: ";

cout « pl->*data « " " « p2->*data « "\n";

cout << "Подвоєні значення: "; cout « (pl->*func)() « " "; cout << (p2->*func) (). « "\n";

return 0;

}

У цьому варіанті програми змінні pi і р2 є вказівниками на об'єкти класу cl, тому для доступу до членів val і double_func () застосовується оператор "->*".

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

int cl::*d; int *p; cl про;

p = &o.val // Адреса конкретної змінної val

d = &cl::val // Зсув узагальненої змінної val

Тут вказівник р посилається на цілочисельну змінну, що належить конкретному об'єкту. В той же час змінна d зберігає зсув члена val усередині будь-якого об'єкту класу cl.

Як правило, оператори, пов'язані з вказівниками на члени класу, застосовуються у виняткових ситуаціях. У повсякденному програмуванні вони зазвичай не використовуються.


 

А также другие работы, которые могут Вас заинтересовать

32797. Античная философия: этапы развития и характерные черты. Первые греческие мыслители 22.71 KB
  Античная философия: этапы развития и характерные черты. Античная философия возникла в Древней Греции в середине I тысячелетия до н. В центре внимания философии данного периода проблемы природы космоса в целом; 2классическая греческая философия учения Сократа Платона Аристотеля V IV вв. Главное внимание здесь уделяется проблеме человека его познавательных возможностей; 3философия эпохи эллинизма III в.
32798. Философия Платона, Теория познания Платона 14.35 KB
  Наиболее известные диалоги Платона: Государство Пир диалоги Софист и Федр посвящены проблеме души Тимей вопросу возникновения Космоса Протагор проблеме добродетели. Человек по Платону единство души и тела которые в то же время противоположны. Смертное тело только тюрьма для души оно источник страданий причина всех зол; душа гибнет если она слишком срослась с телом в процессе удовлетворения своих страстей. Стимулом к совершенствованию души является любовь к прекрасному.
32799. Философия эпохи эллинизма, ее основные направления 14.57 KB
  На развитие античной философии значительное влияние оказал распад империи А. Неоплатонизм получил распространение в период когда античный способ философствования уступал место философии основанной на христианской догматике. Это последняя попытка решить задачу создания целостного философского учения в рамках дохристианской философии. Главное отличие от философии Платона заключается в том что мир идей Платона это неподвижный безличный образец мира а в неоплатонизме появляется активное мыслящее начало Ум.
32800. Вклад Аристотеля в развитие мировой философской культуры (учение о материи и форме). Учение о душе 13.19 KB
  Аристотель 384 322 гг. Аристотель считается величайшим энциклопедистом древности и систематизатором всех философских и научных знаний накопленных до него в области логики физики биологии психологии этики экономии искусствознания и др. Высоко оценивая Платона Аристотель подверг его идеалистическое учение серьезной критике Платон мне друг но истина дороже. Аристотель формулирует свое представление о бытии.
32801. Условия формирования западноевропейской философии в Средние века. Роль христианства в развитии культуры 15.27 KB
  Условия формирования западноевропейской философии в Средние века. Этапы развития и характерные черты средневековой философии. В развитии философии Средних веков можно выделить несколько основных этапов: 1 апологетика II IV вв. В этот период не было создано философских систем но был намечен круг вопросов ставших центральными в средневековой философии: о Боге и соотношении Бога и мира о сотворении мира и структуре мироздания о сущности человека и его месте в мире; 2 патристика V IX вв.
32802. Философия Августина Аврелия (Блаженного). И Фомы Аквинского 14.95 KB
  Учение о Боге и мире. Бог рассматривается им как начало всего сущего как единственная причина возникновения вещей. Бог вечен и неизменен. Мир созданных богом вещей изменчив и пребывает во времени.
32803. Особенности философии Возрождения. Её связь с наукой и искусством. Учения о природе и познании 18.84 KB
  Особенности философии Возрождения. Эпоха Возрождения Ренессанса переходный период от Средних веков к Новому времени XV [в Италии с XIV] XVI вв. Возрождение художественноэстетическая эпоха провозгласившая что высшее призвание человека в мире быть творцом и созидателем Этапы развития и характерные черты философии Возрождения. В философии эпохи Возрождения можно выделить 3 этапа: гуманистический сер.
32804. Эмпиризм и сенсуализм в философии нового времени 16.32 KB
  Локк подчеркивает особую роль органов чувств в процессе познания.Бэкон сделал научное познание в центре его внимания вопросы о целях и методах научного познания.Однако он утверждает что на пути познания имеется множество заблуждений препятствующих получению достоверного знания. Бэкон выделяет 4 вида идолов познания: 1 идолы рода являются следствием ограниченности человеческого ума несовершенством органов чувств; 2 идолы пещеры обусловлены индивидуальными особенностями человека: каждый человек имеет свой внутренний субъективный мир...
32805. Рационализм в философии нового времени 17.35 KB
  Эти две субстанции пересекаются и активно взаимодействуют однако их взаимосвязь является лишь механической. В человеке материальная и духовная субстанции проявляются как тело и душа. В понятии единой субстанции т. Спиноза называет следующие свойства единой субстанции: независимое ни от чего существование; вечность; бесконечность; является внутренней причиной самой себя и всего сущего.