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.

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


 

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

41304. Численные методы и компьютерные технологии решения дифференциальных уравнений 1-го порядка 456.91 KB
  Изучение численных методов и компьютерных технологий решения обыкновенных дифференциальных уравнений 1-го порядка, приобретение практических навыков составления алгоритмов, программ и работы на ЭВМ.
41305. Численные методы и компьютерные технологии решения систем дифференциальных уравнений и дифференциальных уравнений n-го порядка 778.94 KB
  Изучение численных методов и компьютерных технологий решения систем дифференциальных уравнений 1-го порядка и дифференциальных уравнений n-го порядка, приобретение практических навыков составления алгоритмов, программ и работы на ЭВМ.
41306. Построение сетевого графика разработки стандарта предприятия; построение, содержание и изложение стандарта предприятия 1.15 MB
  Целью данной работы является: построение сетевого графика разработки стандарта предприятия; построение, содержание и изложение стандарта предприятия; расчёт годового экономического эффекта от внедрения стандарта предприятия; описание функционирования служб стандартизации на предприятии и структурная схема; проведение нормаконтроля сборочного чертежа «привод электромагнита».
41307. Метод конечных разностей для решения дифференциальных уравнений в частных производных, способы построения трехмерных графиков в среде УМС Mathcad 591.35 KB
  Графики функции.Предусмотреть счетчик числа уточнений итераций значений функции. Значения функции выводить в виде матрицы. Построить график функции fxy.
41308. Изучение методов интерполяции графических или табличных функций 1.09 MB
  Изучение методов интерполяции графических или табличных функций. Задание Изучить методы интерполяции функции. Составить алгоритм и программу линейной интерполяции кривой намагничивания магнитного материала а также табуляции интерполирующей функции. Точки при этом называются узлами интерполяции.
41309. Численные методы и компьютерные технологии решения нелинейных уравнений 471 KB
  За приближенное значение корня принимается точка пересечения хорды АВ с осью абсцисс. Координата этой точки находится из уравнения этой хорды АВ рис. В точке пересечения хорды АВ с осью абсцисс . К уравнению хорды Далее сравниваются значения функции на левой границе и в точке пересечения хорды АВ с осью абсцисс по знаку.
41310. Численные методы и компьютерные технологии вычисления определенных интегралов 337.09 KB
  Вычисление определенного интеграла методом трапеций Текст программы progrm lb6; uses crt; vr bhyffbjj1xe:rel; in:integer; begin clrscr; writeln' = пи 6'; :=pi 6; writeln'b = Пи 3'; b:=pi 3; writeln'Введите n'; redn; h:=b n; y:=0; x:=h; for i:=1 to n1 do begin y:=ysqrsinx cosXsqrcosx sinx;x:=xh; end; f:=sqrsin cossqrcos sin; fb:=sqrsinb cosbsqrcosb sinb ; y:=yffb 2; J:=yh; writeln'J='J:5:2; writeln'Метод НьютонаЛейбница'; j1:= sinb cosbcosb...
41311. Программирование МК серии МС68 на языке АSM 2.84 MB
  В состав служебных модулей входят: генератор тактовых импульсов CGM08 модуль системной интеграции SIM08 модуль контроля напряжения питания LVI08 модуль прерывания в контрольной точке BREK08 модуль управления внешним прерыванием IRQ08 сторожевой таймер COP08 базовый таймер TBM08. Модуль генератора импульсов CGM08 генерирует импульсные сигналы на базе которых модуль системной интеграции SIM08 формирует тактовые импульсы. Модуль системной интеграции SIM08 выполняет ряд функций...
41312. Отладка ППО МК серии МС68 5.11 MB
  Б окне 2 на передний план выходит вкладка Brekpoints nd Trcepoints где теперь будут отображаться все точки останова. 2 Практическая часть Применение точек останова Пошаговый метод отладки удобен для отладки небольших несложных программ или отдельных участков большой программы. Для того чтобы проверить правильность выполнения всего этого цикла в пошаговом режиме пришлось бы очень долго щелкать мышкой В подобных случаях применяются точки останова Brekpoint. Точка останова это специальная метка...