Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Oop3.pdf
Скачиваний:
15
Добавлен:
02.02.2015
Размер:
239.15 Кб
Скачать

 

Зміст

Теоретичні відомості..................................................................................................

2

Термінологія................................................................................................................

2

Типові конструкції мови............................................................................................

2

Передавання «по значенню»......................................................................................

2

Передавання «по покажчику»....................................................................................

3

Передавання «по посиланню»...................................................................................

3

Константні методи......................................................................................................

3

Статичні методи..........................................................................................................

4

Завдання на лабораторну роботу...............................................................................

5

Індивідуальне завдання..............................................................................................

5

Література....................................................................................................................

7

Тема. Константні об’єкти та константні функції, статичні функції у класах. Покажчики, посилання на об’єкти у викликах функцій.

Мета: отримати базові поняття про константі об’єкти та їх використання у програмі.

Теоретичні відомості Термінологія

Константна функція — функція, котра у своїй реалізації не здійснює модифікацій полів об’єкта.

Константний об’єкт — це об’єкт, поля котрого не будуть змінені при роботі функції Статична функція класу — це функція, використання котрої можливе без

створення об’єкту цього класу.

Типові конструкції мови

Константність можна розглядати як наступний вид обмежень для програміста, певний вид прав доступу. Основне призначення const-елементів — це запобігання модифікації полів об’єкта при викликах усередині функцій, які цих дій не передбачають. Використання const-параметрів, це свого роду угода між програмістами, яка закріплена синтаксисом мови про незмінність певних об’єктів на певному етапі.

Передавання «по значенню»

Щоб отримати у функцію const-аргумент, необхідно оголосити функцію

наступним чином:

class COutputConsole

{

public:

/**

*Виводить дані SMS об'єкта.

*При виклику функції застосовується копіювання об'єкта

*@param aSmsMessage SMS об'єкт

*/

void OutputSmsObject1(const CSmsMessage aSmsMessage);

};

При такому синтаксисі буде необхідно зробити наступний виклик:

CSmsMessage smsMessage( "message text", "1234567" ); COutputConsole console;

console.OutputSmsObject1( smsMessage );

При такому ході подій, необхідно розуміти, що для об’єкта smsMessage

на початку виконання функції COutputConsole::OutputSmsObject1() буде викликано конструктор копіювання, а сам об’єкт, що використовуватиметься у функції буде розміщений на стеку. Такий метод є неприпустимий для великих об’ємів даних. Наприклад, об’єкт матиме 3 ГГб виділеної пам’яті для своїх атрибутів. Такі великі об’єми даних копіювати неприпустимо. Для малих задач

також цей метод не використовується, оскільки уповільнює всю систему, а також призводить до надмірного використання оперативної пам’яті.

Для запобігання копіювань використовують передачу аргументів по покажчику або по посиланню

Передавання «по покажчику»

Синтаксис такого оголошення можна прочитати нижче.

class COutputConsole

{

public:

/**

*Виводить дані SMS об'єкта.

*@param aSmsMessage SMS об'єкт

*/

void OutputSmsObject2(const CSmsMessage* aSmsMessage);

};

Виклик:

CSmsMessage smsMessage( "message text", "1234567" ); COutputConsole console;

console.OutputSmsObject2( &smsMessage );

У такому методі у функцію передається лише покажчик на пам’ять де власне розміщений об’єкт та не копіюються всі поля. Таким чином, у функції програміст може використовувати оригінальний об’єкт, звертаючись до його методів за допомогою оператора ->.

Передавання «по посиланню»

Передавання об’єктів по посиланню використовується частіше, аніж передача по покажчику. До об’єкту, що передається по посиланню непотрібно застосовувати оператор ->, тому програмістам цей синтаксис подобається більше і він спрощує явні розадресування, коли у класі є перевантажена операція operator[].

Синтаксис оголошення наведено нижче:

class COutputConsole

{

public:

/**

*Виводить дані SMS об'єкта.

*@param aSmsMessage SMS об'єкт

*/

void OutputSmsObject3(const CSmsMessage& aSmsMessage);

};

Виклик:

CSmsMessage smsMessage( "message text", "1234567" ); COutputConsole console;

console.OutputSmsObject3( smsMessage );

Константні методи

Після того, як у функцію передано константний об’єкт програміст може використовувати лише читання публічних атрибутів, а також виконувати константні методи. Константний метод не може змінювати атрибутів класу і має специфікатор const після оголошення перед “;”.

У разі присвоєння публічному атрибуту якоїсь величини, компілятор

видає наступну помилку:

…\lab3\outputconsole.cpp(26): error C2166: l-value specifies const object

При спробі викликати неконстантний метод CSmsMessage::SetReceiver() у

константного об’єкта, отримуємо:

...\lab3\outputconsole.cpp(40): error C2662: 'CSmsMessage::SetReceiver' : cannot convert 'this' pointer from 'const CSmsMessage' to 'CSmsMessage &'

Синтаксис оголошення константного методу:

class CSmsMessage

{

public:

/**

*Константний метод

*@return Текст повідомлення

*/

const char* Text() const;

};

Константні методи повинні обов’язково повертати лише константні об’єкти.

Статичні методи

Класи зазвичай працюють із своїми атрибутами, застосовуючи методи роботи надо своїми внутрішніми змінними. Проте, інколи приходиться писати методи, котрі не працюють із даними класу. При такому підході створювати об’єкт, а далі викликати потрібний метод є недоцільним. Для цієї мети використовують статичні методи. Такі методи можна використовувати без створення об’єкту, ніби звичайні функції тільки із всіма перевагами класів.

Оголосити такий метод можна наступним чином:

class COutputConsole

{

public:

/**

*Виводить дані SMS об'єкта.

*При виклику функції застосовується копіювання об'єкта на стек

*@param aSmsMessage SMS об'єкт

*/

static void OutputSmsObject1(const CSmsMessage aSmsMessage);

};

Як використовувати такий метод можна збагнути наступного коду:

CSmsMessage smsMessage( "message text", "1234567" ); COutputConsole::OutputSmsObject1( smsMessage );

Потрібно сказати про особливість реалізації функцій класів. Компілятор, для забезпечення роботи із кожним об’єктом у метод передає першим параметром покажчик на власний об’єкт. Доступ до цього покажчику можна використати у програмі, звертаючись до прихованого поля this. Статичні методи отримують «чисті» параметри, і тому можуть бути викликані без попереднього створення об’єкту.

Доцільність таких функцій можна поставити під сумнів, але є декілька сценаріїв використання таких функцій:

1.Потрібно передати «call-back»-функцію.

2.Потрібно використати загальні дії без використання атрибутів.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]