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.

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


 

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

76268. Этика делового общения 31.29 KB
  Этика делового общения совокупность нравственных норм правил и представлений регулирующих поведение и отношения людей в процессе их производственной деятельности. Этика делового общения представляет собой частный случай этики вообще и содержит в себе ее основные характеристики.
76269. Проведення судово-психологічної експертизи 20.22 KB
  У процесі судово-експертного дослідження проводиться ретроспективний аналіз психологічний аналіз результатів діяльності людини. обвинувачуваного у скоєнні вбивства була призначена судовопсихологічна експертиза з метою визначення чи перебував обвинувачений у момент...
76270. Поняття цивілізації. Типологія цивілізацій та контакти між цивілізаціями в часі 97.83 KB
  За багатьма ознаками нашу епоху можна назвати переломною історичною епохою, коли особливо гостро постають питання пошуку джерел та нових суспільних форм соціально-політичного та економічного розвитку, його гармонізації із соціальними відносинами та навколишнім природнім середовищем.
76271. Сутність та роль фінансової звітності 68.64 KB
  Саме завдяки фінансовій звітності рівень достовірності якої підтверджено аудитором формуються передумови здійснення значних фінансовогосподарських операцій. Ці вигоди можливо отримати завдяки ефективному використанню достовірної облікової інформації яка міститься у фінансовій звітності...
76272. ЭКОЛОГИЧЕСКИЕ ФАКТОРЫ И ИХ ВЛИЯНИЕ НА ЗДОРОВЬЕ 51.72 KB
  Все процессы в биосфере взаимосвязаны. Человечество - лишь незначительная часть биосферы, а человек является лишь одним из видов органической жизни. Разум выделил человека из животного мира и дал ему огромное могущество.
76273. Фонетика в латинском языке 30.12 KB
  В классическом латинском языке ударение согласно свидетельствам античных грамматиков было музыкальным повышение тона на ударном гласном; место ударения практически полностью определялось фонологической структурой слова.
76274. Олимпийские игры 91.35 KB
  Приняли участие лучшие спортсмены северных стран Норвегии Финляндии Швеции. Во всех дисциплинах лыжного спорта победителями оказались спортсмены Норвегии. Непревзойденными в хоккее были спортсмены Канады имевшие огромное преимущество над соперниками.
76275. ИНФЕКЦИОННЫЙ ЭНДОКАРДИТ 34.82 KB
  Наряду с этим к значимым факторам риска ИЭ у детей и подростков относятся пролапс митрального клапана особенно с миксоматозным утолщением клапанных створок и митральной регургитацией длительно стоящие катетеры центральных вен и перенесенные операции на сердце.
76276. Ишемический инсульт 19.56 KB
  Прежде всего на МРТ не визуализируется типичный эффект потери сигнала от сосудов в зоне патологии. В течение первых 3 сут развития инфаркта мозга на МРТ с контрастированием примерно в 30 случаев может наблюдаться усиление сигнала от соседней твердой мозговой оболочки.