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.

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


 

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

1431. Система управления и контроля радиоприемным устройством 1.07 MB
  Обеспечение функционирования вычислительного комплекса, обнаружения сбоев и отказов модулей и горячего восстановления. Требования к организации и оборудованию рабочих мест с ПЭВМ для взрослых пользователей. Команды буфера интерфейсной информации.
1432. Расчет параметров двигателя 147.5 KB
  При выборе отношения хода поршня к диаметру цилиндра S/D необходимо учитывать следующие обстоятельства. Предназначен для преобразования возвратно-поступательного движения поршня во вращательное движение коленчатого вала.
1433. Проект для строительства завода по ремонту бытовых машин в городе Белово 128.5 KB
  Проект разработан для строительства в городе Белово, преобладающее направление ветров ЮЗ с силой 0.38 кПа. Нормативное значение веса снегового покрова принято 1.5 кПа. Глубина промерзания грунтов 2.2 м. Температура наружного воздуха наиболее холодной пятидневки – 400С.
1434. Экономическое обоснование проектирования двигателя 124.5 KB
  Целью расчетов является обоснование экономической целесообразности создания и применения спроектированного двигателя. Решение принимается на основе расчета экономического эффекта путем сопоставления результатов и затрат по проектируемому и базовому вариантам при условии сопоставимости их по объему
1435. Уровневые фронтальные лабораторные работы 231.52 KB
  Составной частью исследуемой проблематики является уровневый подход к формированию практических умений и навыков школьников. Для реализации этой цели учителем разработаны уровневые фронтальные лабораторные работы, и примеры использования проектной технологии как возможности вариативной организации учебных занятий.
1436. Алгоритм решения задачи с использованием программ Microsoft Excel и MathCAD 265.69 KB
  Данная работа посвящена автоматизации процессов расчетов. Ее целью является закрепление знаний по всем разделам дисциплины Информатика, проверка навыков практической работы с программными средствами обработки информации.
1437. Основные модели данных 182.57 KB
  В зависимости от используемой модели СУБД называются соответственно: сетевыми, иерархическими и реляционными. Манипулирование данными. Сетевая база данных. Достоинства и недостатки иерархических и сетевых СУБД.
1438. Теоретическое и экспериментальное исследование процесса сушки абрикос с применением токов высокой частоты 3.32 MB
  Современные теоретические представления о тепло- массопереносе в процессах сушки. Электрофизические параметры абрикос и их влияние на объемное тепловыделение. Экспериментальное определение электрофизических параметров абрикос. Математическая модель динамики изменения электрофизических параметров абрикос.
1439. Использование распознавания образов для обработки и восстановления музыкальных сигналов 7.15 MB
  Определение полного перечня признаков, характеризующих объекты, преобразование информации при распознавании музыкального сигнала. Статический подход к распознаванию образов. Общая характеристика современной техники восстановления.