Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Вкладені класи та їх призначення.

Поиск

Існують випадки, коли оголошення класу містить оголошення інших вкладених класів. У таких випадках такі класи називаються вкладеними (nested classes), а клас, що їх об’єднує, називається класом із об’єктною ідентичністю (object identity). Розглянемо схематичний приклад, який описує вкладений клас Nested у класі С:

class C

{ class Nested{Nested(int a);~Nested();}; C(int b){Nested d(b);}; ~C{}; };

C::Nested::Nested(int a){…}

C::Nested::~Nested()

int main(int argc, char *argv[])

{ C object(3); return 0;}

При виконанні цієї програми буде виконано наступну послідовність:

Constructor of Nested class

Destructor of Nested class

Constructor of C class — я (Цимбалюк) вважаю, що це має стояти на першому місці, але Погорілий казав так, як написано тут.

Destructor of C class

Механізм вкладених класів широко використовується при реалізації технології COM від Microsoft. Одна з основних цілей цієї технології полягає у відокремлені інтерфейсу класу від його реалізації.


 

Локальні класи та їх призначення

Локальний клас – клас, визначений всередині функції. Локальний клас є видимии лише у межах функції, в якій він визначений. Всі його члени повинні бути визначені всередині тіла класу (тобто вони є inline -функціями). Локальний клас не може мати статичних членів. Локальні члени класу не можуть звертатися до локальних змінних (auto), але можуть використовувати: імена типів, статичні змінні (static) і перерахування (enum), визначені в функції, в якій визначений цей клас, також external змінні та функції. Призначення: 1) Для економії глобального простору імен (локальний клас потрібен і буде використовуватись лише тою функцією, в якій він оголошений). 2) В тих ситуаціях, коли об’єкти мають обмежений час існування в програмі або вимагається миттєве вивільнення пам’яті під масиви об’єктів (локальні класи знищуються при поверненні з фукнції, що їх створила).

Приклад:

int x; // global variable

void f() // function definition

{

static int y; // static variable y can be used by local class

int x; // auto variable x cannot be used by local class

extern int g(); // extern function g can be used by local class

 

class local // local class

{

int g() { return x; } // error, local variable x

// cannot be used by g

int h() { return y; } // valid,static variable y

int k() { return::x; } // valid, global x

int l() { return g(); } // valid, extern function g

};

}

 

 


 

21. Призначення «дружніх» функцій у Сі++. Навести приклади.

Достоїнством класу є можливість приховування даних членів об’єкта, таким чином вони захищені від зовнішній впливів і доступ до них може бути отриманий лише за допомогою методів цього об’єкта. Але бувають випадки, коли необхідно отримати доступ до даних об’єкта не використовуючи його інтерфейс. Звичайно, можна додати новий метод до класу для отримання прямого доступу до внутрішніх змінних, але при доступі до них через методи об’єкта зменшується ефективність роботи за рахунок затрат на виклик метода. У більшості випадків це не критично, але не завжди. До того ж у більшості випадків об’єкт організований певним чином для виконання певних операцій, і наша функція може бути зовсім недоречною. Ще гірше, якщо необхідно отримати прямий доступ до внутрішніх даних кількох різних об’єктів. Тут є дуже зручним використання дружньої функції, яка може бути може бути другом одразу декільком класам. Саме такі функції використовуються для вирішення вищеописаних проблем. Отже, дружня функція – це функція, яка не являючись частиною класу, має доступ до всіх елементів дружнього до себе класу.

Для того, щоб оголосити функцію – друга до того чи іншого класу, необхідно у описі цього класу оголосити її із використанням ключового слова friend. Якщо ця функція дружня до кількох класів, то треба додати це оголошення у всі ці класи. Зауважимо, що немає різниці в який розділ описів класу (public, protected чи private) доданий опис дружньої функції.

Наведемо простенький приклад з використанням дружньої функції.

#include "stdafx.h"

class A

{

int x; //Приватный элемент из класса A

friend void get_x(int, A &);

//Прототип дружественной функции для занесение в приватный x значения

 

public:

void show(); //Прототип функции для отображения x из приватного поля

};

 

void get_x(int N, A &obj_A) //Функция не является частью класса, но работает словно является

{

obj_A.x=N; //в элемент x класса A передается принимаемый параметр N

}

void A::show() //Функция является частью класса A и играет роль посредника

{

printf("%d\n",x); //Отображаем приватный элемент x из класса A

}

void main()

{

int value=100; //value будет передаваться как параметр вовнутрь класса в приватный x

A obj_A;

get_x(value, obj_A); //Работаем как с обычной функцией.

obj_A.show(); //Отображаем результаты

getch();

return;

}

Приклад простий, прозорий, тому не потребує особливих пояснень. Зауважимо лише на те, що х оголошено як private, тому для доступу до неї необхідно використовувати метод класу, так як це робить метод show, або дружні функції, так як це зроблено на прикладі функції get_x.

До друзів і дружності застосовні наступні правила:

На оголошення friend не впливають специфікатори public, protected або private;

оголошення friend не взаємні: якщо А оголошує В другом, то це не означає, що А є другом для В;

дружність не успадковується: якщо А оголошує В другом, класи, похідні від В, не будуть автоматично отримувати доступ до елементів А;

дружність не є перехідною властивістю: якщо А оголошує В другом, класи, що походять від А, не будуть автоматично визнавати дружність В.

 

22. Правила перевантаження операцій у Сі++.

Механізм, який дозволяє операціям надати новий зміст

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

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

Синтаксичне визначення перевантаження операції виглядає так.

<імя_типу>operator<символ_операції>(<список_параметрів>)

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

Символ_операції – символ операції, що перевантажується. Наприклад, + - / *

Список_параметрів – визначає тип, що передаються при кожному виклику функції,яка замінює операцію.

Перевантаження операції можна виконати кілька разів, і тоді її зміст визначається контекстом.

Введемо операції додавання та множення для комплексних чисел.

Class complex

{

double re, im;

public:

complex(){re = im =0}

complex(double r, double i);

{

re = r; im = i;

}

}

Нескладно реалізувати функції add і mult, які будуть додавати і множити значення.

Complex c1(1,0), c2(2,1),c3;

c3 = Add(c1,c2);

c3 = Mult(c1,c2);

В С++ це можливо за рахунок перевантаження операцій, яке реалізує перевизначення декларації операцій + і *.

friend complex operator +(complex c1, complex c2)

{

return complex(c1.re+c2.re, c1.im + c2.im);

}

friend complex operator *(complex c1, complex c2)

{

return complex(c1.re * c2.re – c1.im * c2.im, c1.re*c2.im+c2.re*c1.im);

}

Після цього коду функція оператор + і * будуть викликатися неявно при кожному додаванні чи множенні комплексних чисел.

Функції і оператори можуть викликатися явно, тобто

c3 = operator+(c1,c2);

c1 = operator*(c1,c2);

Приклад,

void f()

{

complex a = complex(1,3.1);

complex b = complex(1.2,2);

complex c = b;

…..

a = b + c;

b = b + c*a;

…..

B = B + C *A;//де A,B,C – матриці(якщо є відповідні описи)

}

Реалізація механізму перевантаження операцій в Сі++ реалізується за допомогою механізму функцій-друзів класу і функції – оператора(operator).

Оператори С++,які не можна перевантажувати

«.» - вибір елемента

«.*» - вказівник на елемент

«::» - дозвіл області видимості

«?:» - умовний оператор порівняння (тернарний оператор)

Новий оператор створити неможливо(Наприклад, непотрібно намагатися створити operator**, що підносить до степеня).


 



Поделиться:


Последнее изменение этой страницы: 2016-07-14; просмотров: 222; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.99.192 (0.005 с.)