68967

Масиви об’єктів, покажчики на об’єкти

Лекция

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

В мові C++ масиви можуть складатися з об’єктів. З синтаксичної очки зору оголошення масиву об’єктів нічим не відрізняється від оголошення масиву вбудованого типу. Приклад програми, в якій використовується масив, який складається з трьох елементів.

Украинкский

2014-09-28

55 KB

8 чел.

Лекція № 12

Тема: Масиви об’єктів, покажчики на об’єкти

План

  1.  Масиви об’єктів
  2.  Ініціалізовані та неініціалізовані масиви
  3.  Покажчики на об’єкти
  4.  Передача параметрів за допомогою посилань
  5.  Передача посилань на об’єкти
  6.  Повернення посилань

Масиви об'єктів

В мові C++ масиви можуть складатися з об'єктів. З синтаксичної очки зору оголошення масиву об'єктів нічим не відрізняється від оголошення масиву вбудованого типу. Приклад програми, в якій використовується масив, який складається з трьох елементів.

#include <iostream>

using namespace std;

class cl {

int і ; public:

void set_i(int j) { i=j; }

int get_i() { return і; }

};

int main()

{

cl  ob[3];

int   і ;

for(i=0;   i<3;   i++)

ob[i].set_i(i+1);

for(i=0;   і<3;  i++)

cout<< ob[i].get_i()<< "\n";

return 0;

}

Ця програма виводить на екран числа 1, 2 і 3.

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

Якщо конструктор має лише один параметр, можна просто задати список початкових значень, використовуючи звичайні синтаксичні конструкції, призначені для ініціалізації масивів. В міру створення елементів масиву ці значення по черзі присвоюються параметру конструктора. Змінемо злегка версію попередньої програми.

#include <iostream>

using namespace std;

class cl {

int і ;

public:

cl(int j) { i=j; } // Конструктор

int get_i()

{ return і; }

};

int main ()

{

cl ob[3]  = {1,2, 3};   //   Список ініціалізації int  і;

for(i=0;   i<3;   i++) cout <<  ob[i].get_i()   <<   "\n";

return  0 ; }

Як і раніше, ця програма виводить на екран числа 1, 2 і 3.

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

Ініціалізовані і неініціалізовані масиви.

Особлива ситуація виникає, коли необхідно створити масиви об'єктів, які ініціалізували, та і неініціалізували. Розглянемо наступний клас.

class  cl   {

int  і;

public:

cl(int  j)  { i=j;}  //   Конструктор                               

int  get_i()   { return  і;}

};

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

Таким чином, масив не можна оголосити звичайним чином

cl а[9];   //  Помилка,   конструктору необхідний список ініціалізації

Цей оператор не працює, оскільки передбачається, що клас cl не має параметрів, оскільки в оголошенні масиву не вказаний список ініціалізації. Проте клас cl не містить конструкторів, які не мають параметрів. Отже, оскільки даному оголошенню не відповідає жоден конструктор, компілятор видасть повідомлення про помилку. Щоб вирішити цю проблему, необхідно перенавантажувати конструктор, додавши варіант, який не має параметрів. Тепер в програмі можна оголосити обидва види масиву.

class cl {

int і; public:

cl() { і=0; } // Викликається для неініціалізованих масивів

cl(int j) { i=j;}// Викликається для масивів які інціалізуються

int get_i

{ return і;}

};

В такому варіанті програми допускаються наступні оператори.

cl al[3]= {3, 5, 6};   // Масив який ініціалізується

cl а2[34];               //  Неініціалізований масив

Покажчики на об'єкти

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

#include <iostream>

using namespace std;

class cl {

int і;

public:

cl(int j) { i=j; }

int get_i() { return і; }

};

int main()

cl ob(88), *p;

p = &ob;   // Одержуємо адресу об'єкту ob.

cout << p->get_i(); // для виклику функції get_i() // застосовується оператор ->

return 0 ;

}

Як відомо, при збільшенні покажчика на одиницю він переміщається на наступний елемент того ж типу. Наприклад, цілочисельний покажчик посилатиметься на наступне ціле число. Як правило, адресна арифметика залежить від типу покажчика. (Інакше кажучи, вона залежить від типа даних, на які посилається покажчик.). Це правило торкається і покажчиків на об'єкти.

Покажчику можна привласнити адресу відкритого члена об'єкту, а потім посилатися на цей член з його допомогою. Розглянемо наступну програму, яка виводить на екран число 1.

#include <iostream>

using namespace std;

class cl {

public:

int   i;

cl (int j) { i=j;}

int main ()

{

cl ob(l);

int   *p;

p = &ob.i;    // Отримати адресу члена ob.i.

cout << *p;  // Звернення до члена ob.i через покажчик р

return 0;

}

Оскільки покажчик р посилається на ціле число, він має тип int. В даному випадку не має значення, що змінна є членом об'єкту ob.

Передача параметрів за допомогою посилань

Найважливіше застосування посилань полягає в створенні функцій,  які автоматично передбачають передачу параметрів по посиланню. Аргументи передаються функції двома способами: по значенню і по посиланню. Якщо аргумент передається по значенню, функція одержує його копію. За замовчуванням в мові C++ застосовується передача аргументів по значенню, проте є дві можливості передати їх по посиланню. По-перше, можна явно передати покажчик на аргумент. По-друге, можна передати посилання на аргумент. В більшості ситуацій другий спосіб більш переважний.

Наступна програма явно створює покажчик на аргумент функції neg (), призначеної для зміни знака цілочисельної змінної.

// Аргумент передається по посиланню за допомогою явного покажчика.

#include <iostream>

using namespace std;

void neg(int *i);

int main()

int x;

x = 10;

cout << x << " є запереченням числа ";

neg(&x);

cout << x << "\n";

return 0;

}

void neg(int *i)

{

*i = -*i;

}

В даній програмі функція neg() одержує як параметр покажчик на цілочисельну змінну, знак якої треба поміняти на протилежний. Отже, функція neg() повинна явно одержувати адресу змінної х. Крім того, щоб отримати доступ до змінної, на яку посилається покажчик всередині функції neg(), необхідно застосовувати оператор "*". В мові C++ існує можливість автоматизувати цей механізм, використовуючи параметри, які є посиланнями. Щоб створити посилання на параметр, перед його ім'ям слід ставити символ & як, наприклад, оголошується посилання на аргумент і функції neg ().

 

void neg(int  &i);

В цьому випадку ім'я і стає другим ім'ям аргументу функції neg (), і будь-які операції над нею автоматично розповсюджуються на фактичний аргумент. З технічної точки зору змінна і є неявним покажчиком на аргумент функції. Тепер необов'язково ставити перед ім'ям аргументу символ &. Розглянемо нову версію програми.

// Застосування  посилання на аргумент.

#include <iostream>

using namespace std;

void neg(int &i);   //  Змінна  і  стала посиланням

int main ()

{

int  x;

x =  10;

cout << x <<   "   є  запереченням числа   " ;

neg(x);   //  Оператор & більше   не потрібен

cout <<  х <<   " \n" ;

return 0 ;

}

void neg(int &i)

{

і = -і; // Змінна і є посиланням, оператор * більше не потрібен

}

Посилання на параметр автоматично (неявно) встановлюється на аргумент функції. Отже, в попередній програмі оператор

і = -і;

насправді працює із змінною х, а не з її копією. Оператор & стає не потрібним. Крім того, всередині функції параметр, переданий за допомогою посилання, використовується безпосередньо, без застосування оператора "*". Як правило, значення, присвоєне посиланню, насправді присвоюється змінній, до якої це посилання відноситься. Всередині функції посилання на параметр неможливо пов'язати з іншою змінною. Інакше кажучи, оператор

і++;

всередині функції neg () збільшує значення параметра, а не переміщає покажчик і на нову комірку.

Передача посилань на об'єкти

При передачі об'єкту як параметр функції створюється його копія. Після закінчення роботи функції викликається деструктор копії. Проте, якщо параметр викликається за допомогою посилання, копія об'єкту не створюється. Це значить, що після повернення управління параметр функції не знищується і деструктор не викликається. Приклад:

#include <iostream>

using namespace std;

class cl {

int id;

public:

int і ;

cl(int i);

~cl();

void neg(cl &o) { o.i = -o.i; }// Тимчасовий об'єкт не створюється

};

cl::cl(int num)

{

cout << "Створення об'єкту " << num << "\n";

id = num;

}

cl::~cl()

{

cout << "Знищення об'єкту " << id << "\n";

}

int main()

{  

cl о(l);

о. і  =   10;

о. neg(о);

cout <<  о. і  <<   " \n" ;

return   0;

}

Повернення посилань

Функція може повертати посилання на об'єкт. Таким чином, виклик функції может стояти в лівій частині оператора присвоєння

Розглянемо наступний приклад.

include <iostream>

using namespace  std;

char &replace(int   i) ;   //   Повернення  посилання

char s[80]  =   "Загальний  привіт";

int main ()

replace(5)  =   'X';   //  Вставляємо символ Х між словами

//   "Загальний" і  "привіт"

cout <<   s;

return  0;

}

char &replace(int  і)

{

return  s [і] ;

}

Ця програма вставляє символ X замість пропуску між словами "Загальний" і "привіт", тобто виводить на екран рядок "ЗагальнийХпривіт".

Функція replace () повертає посилання на символ, який входить в рядок s, індекс якого заданий змінній і. Потім в функції main() за допомогою посилання відповідному елементу рядка привсвоюється символ X.


 

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

29477. ЧЕЛОВЕК НЕДОВОЛЬНЫЙ: ПРОТЕСТ И ТЕРПЕНИЕ 114.5 KB
  Чтобы преодолеть видимый парадокс нужно определить те социальные условия и структуры которые формируют и поддерживают такое сочетание а точнее взаимодействие недовольства и терпения в обществе. или к неэффективности современного социального недовольства фонового констатируют бесспорные факты но не объясняют их. Состояние общественно значимого недовольства возникает как реакция на сравнение то ли с лучшим по крайней мере более спокойным прошлым то ли с неосуществленным светлым будущим точнее с иллюзией такого будущего...
29478. ЧЕЛОВЕК ЛУКАВЫЙ: ДВОЕМЫСЛИЕ ПО-РОССИЙСКИ 150 KB
  Он приспосабливается к социальной действительности ища допуски и лазейки в ее нормативной системе то есть способы использовать в собственных интересах существующие в ней правила игры и в то же время что не менее важно постоянно пытаясь в какойто мере обойти эти правила. Успех этой системы на долгие десятилетия по крайней мере был бы невозможен если бы она опиралась только на массовое принуждение и массовый обман. Практическое отсутствие общеобязательных авторитетов создает многополярную структуру нормативного поля где...
29479. «ЧЕЛОВЕК ОГРАНИЧЕННЫЙ»: УРОВНИ И РАМКИ ПРИТЯЗАНИЙ 107.5 KB
  Стабильность притязаний На протяжении ряда лет данные ВЦИОМ охватывают как реальные так и воображаемые приписанные показатели положения человека: данные о полученном и желаемом нормальном по мнению опрошенных доходе и т. При этом 72 опрошенных считали что они получают намного меньше или несколько меньше чем заслуживают; 19 что они получают столько сколько заслуживают; 8 что получают больше чем того заслуживают. Если бы в распоряжении опрошенных исследование типа Мониторинг март 1997 г. При сходной формулировке...
29480. НАШИ ДЕСЯТЬ ЛЕТ: ИТОГИ И ПРОБЛЕМЫ (околоюбилейные размышления) 128 KB
  было подписано Постановление Президиума ВЦСПС и Госкомтруда СССР О создании Всесоюзного центра изучения общественного мнения по социальноэкономическим вопросам формальная дата появления на свет ВЦИОМ. Первое десятилетие жизни и работы ВЦИОМ можно рассматривать под разными углами зрения перебирать опросы отчеты оценивать кадры вспоминать конфликты и т. Что такое ВЦИОМ Условия и время создания нашего центра естественно наложили свой отпечаток на характер ВЦИОМ как организации или даже как своеобразного организма. Вопервых...
29481. Общественные перемены и общественное мнение 23 KB
  Человек политический: сцена и роли переходного периода 9. Человек толпа и масса в общественном мнении 17. Средний человек: фикция или реальность 19. Советский человек пять лет спустя: 19891994 гг.
29482. ОТ МНЕНИЙ К ПОНИМАНИЮ 90 KB
  Москва 2000 ОТ АВТОРА В книге собраны статьи публиковавшиеся в журнале Мониторинг общественного мнения1 с 1993 по 2000 гг. В этой формуле выражен один из основных принципов работы нашего центра: использовать данные изучения общественного мнения для понимания процессов и перемен в социальной экономической политической и культурной жизни общества. ВЕКТОРЫ ПЕРЕМЕН: СОЦИОКУЛЬТУРНЫЕ КООРДИНАТЫ ИЗМЕНЕНИЙ Уровни и предмет анализа в социальном исследовании Результаты массовых опросов общественного мнения как зарубежные так и отечественные чаще...
29483. ОБЩЕСТВЕННОЕ МНЕНИЕ В ГОД КРИЗИСНОГО ПЕРЕЛОМА 64.5 KB
  Дело не просто в падении или росте доверия к отдельным лидерам организациям институтам власти и пр. Первая относится к марту апрелю парламентский кризис попытка импичмента президента референдум как стремление найти выход из парламентского а точнее конституционного тупика при помощи прямого обращения президентской власти к авторитету общественного мнения. Обратная сторона этой медали изменение содержания таких традиционных категорий политической жизни как лидерство доверие поддержка властных структур или оппозиция власти. оказалась...
29484. ФАКТОРЫ И РЕСУРСЫ ОБЩЕСТВЕННОГО МНЕНИЯ В УСЛОВИЯХ «ПОСТМОБИЛИЗАЦИОННОГО ОБЩЕСТВА» 60.5 KB
  Малоэффективны поэтому реальными заслонами на пути лавины может служить лишь инерция сила привычки массового сознания и поведения а также относительная кратковременность всякого эмоционального состояния общества будь то увлечение или отталкивание восторг и страх. Эмоциональный всплеск оказался кратковременным уже в октябре ноябре стали усиливаться факторы массового разочарования и отчуждения. Ни устойчивые демократические институты ни устойчивая расстановка основных политических сил не сложились. Негативная мобилизация охватила...
29485. ФАКТОРЫ ПЕРЕМЕННЫЕ И ПОСТОЯННЫЕ: СВОДНЫЙ МОНИТОРИНГ 1994–1995 гг. 83.5 KB
  Объединенный мониторинг (апрель 1994 г. — май 1995 г.) суммирует данные девяти исследований, проведенных в течение года, свободного от электоральной горячки. Как видно из приводимых ниже данных, основные показатели социальных процессов и оценки событий в общественном мнении за этот период оставались практически стабильными. На этом внешне спокойном фоне выделяются три зоны достаточно резких сдвигов