Перетворення за допомогою конструкторів. 


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



ЗНАЕТЕ ЛИ ВЫ?

Перетворення за допомогою конструкторів.



Char->int; int->char;

Double->float.

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

Class c

{public: c(d);} //c->d

class x

{public: x(int);

x(const char *, int=0);}

void f()

{x x1=1; //x(int)

x x2=”example”; //x (const char*, int=0) -не обов’язковий

x x3,x4;

x3=2;

x4=”One more time”;}

class X

{public: X(int);}

class Y

{public: Y(X);}

void f(Y)

f(3); //error int->X->Y

 

23.Перетворення за допомогою перетворюючих ф-цій.

Перетвор.ф.–ф. член кл. Синтаксис:

Class c{operator ім”я типу();};

c->ім”я типу.

Обгрунтування існування пере-твор. Ф.:

1.Коли треба перетворити кори-стувацький тип у базовий стан-дартний,за допомогою конструк-тора це не можливо (int (X)-некоректно)

class X

{public:

operator int()};

2.Тоді,коли треба виконати пе-ретворення з якогось користува-цького типу Х в якийсь штучний тип Y і небажано змінювати X->Y

class X

{public:

operator int();

operator Y();};

Наприклад:

Class employer

{char*name;

int code;

public: operator int();}

employer::operator int();

{return code;}

Тип повертаємого значення та список формальних параметрів перетворюючі ф. задавати не мо-жуть.

Class X

{int operator (int*());//error

operator int*(int);// error

operator int*();}//Ok

3.Перетвор.ф. не може переван-тажуватися.

Class X

{public:operator int();};

void f (X a)

{int i;

X b;

i=(a<1)?a:0;

if(a) i=b;

else i=a&&b;};

4.Перетвор.ф. можуть наслідува-тися.

Class c

{public:operator int();};

class d: public c

{...}

void main ()

{d 0;

int i=0;

cout<<i;}

5.Перетвор.ф. може бути віртуа-льною.

Class c

{public:

vitual operator char ()

{return ‘c’;}};

class d:public c

{public:operator char()

{return ‘d’};};

void f(c*pc,d*pd)

{count<<*pc<<’_’<<

*pd;

pc=new d;

cout<<*pc;}

Якщо на екрані з’явиться d,то це означає, що перетвор.ф. може бути віртуальною.

 

24.Області видимості.

В мові Си діє декілька просторів імен, шаблони структур, перелі-кових типів для структур..., змінні, мітки.

Struct S

{...}S; //Ok

Область видимості одна.В С++ один простір імен та багато об-ластей видимості для кожного простору.Стандарт ANSI-прос-тір імен,неявна область видимо-сті.

Int i;

Class c

{int i; void f ();};

void f (){...=i;}; //гло-

бальна і.

Void c::f(){...=i;};//гло-

бальна і.

Приклад:

Int i;

Class c

{int i;

friend void f();}

void f(){...=i;}; //гло-

бальна і.

Приклад:

Int i,j;

Class b

{public: int i,j;};

class d: public b

{int i;

void f(){i=j};}

Правила для областей:

1.Кожній області видимості від-повідає своя таблиця імен та іде-нтифікаторів.В С++ існують таб-лиці символів: глобальна(існує в єдиному екземплярі),таблиця кл.,ф.Вони зв’язані між собою таким чином,що кожна таблиця має покажчик на батька,у глоба-льній покажчик нульовий.Таб-лиця кл. показує на беспосеред-ній базовий кл.Таблиця ф.вка-зує на таблиці кл.(якщо вона є членом),або на глобальну табли-цю.

2.Область видимості задається посльдовністю таблиць символів від даного місця в програмі і до глобальної таблиці.

Class B {/*1*/} B,GP

Void f1 ();

{/*2*/ f1,GP

class c1

{/*3*/ c1,GP

class c2:public B

{/*4*/ c2,B, GP

friend void f2()

{/*5*/} f2,GP

void f3(){/*6*/}} f3,c2, B,GP

void f4(){/*7*/}} f4,c1, GP

}

 

 

25.Об’ктно-орієнтовані можливості потоків. Ієрархія по-токових кл. Введення/ виве-дення потокових кл., типи кот-рих створені користувачем.

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

Cout<<i<<...<<j;

Operator<<(..,..); // (ostream&,int)

Cout<<i<<f<<d;

При виводі int послідовність зна-чень перетворюється в послідо-вність символів,а при вводі від-бувається перетворення симво-лів на деяке значення типу конк-ретних даних.

Ієрархія потокових класів

Ios<-istream<-iosteam

Ostream

Ці кл. містяться в бібліотеці <iostream.h>

Існують кл. ifstream,ofstream –визначають файл для потоку. При введені інформації з потоку:

1.Встроєні типи

istream>>(int); //для char немає float

Імена cin,cout-це екземпляри кл. istream,ostream;

Треба виклик.

Cin.get();

(cin.operator>>(i)).operator>>(j)...

class a{...};

a A;

cin>>A;

class complex

{public:

friend istream&operator (istream;complex c);};

istream& opera tor>>(istream&,com-

plex c)// обов”язково бо інакше створюється локальна змінна.

{return i>>Re>>Im;}

 

26.Потоки.Віртуальні операції введення та виведеня.

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

Cout<<i<<...<<j;

Operator<<(..,..); // (ostream&,int)

Cout<<i<<f<<d;

При виводі int послідовність зна-чень перетворюється в послідов-ність символів,а при вводі від-бувається перетворення симво-лів на деяке значення типу конкретних даних.

Cin>>ptr;

A*ptr;

Ptr=new B

Перевантаженя >>.Дружність.

friend istream&operator >>(istream&,A*p)

{return p->input;}

istream&A::input(istream&)

//virtual

(return i>>0;)

class A

{public:

virtual istream & input(instream&);}

 

 

27.Форматування потоків. Ма-ніпулятори.

Стан потоку описується типом fmt flags він інкапсульований в кл. ios.Флаг (ios.h)

Skipws-пропускати пропуски.

Left,right-вирівнювати

Dec,oct,hex-система чмслення.fixed-формат виведення чисел з плавоючою точкою.

Функції:

Ios::fmtflags flags()-считується стан потоку

Ios::fmtflags flags(fmtflags&)-встановлюється стан потоку

Flags(flags()/ ios::fixed)

Ios::setf(fmtflags&)-встановлюються ф-ції стану потоку

Setf(ios::dec/ios::left)

Краще користуватися маніпуля-торами.

Unsetf();-очистка стану потоку. Проміжний стан між флагами потоку та маніпуляторами.

1.ios::width(int)-задає ширину даних вводимих в потік.

2.ios::precision(int)-для вводу чи-сел з плавоючою крапкою по за-мовчуванню.

Звертенн я:

Cout.width(5);

Cout<<’(’<<123<<’)’;

Cin>>a>>b>>c;

Cout<<a<<b<<flash<<c

//flash-ф-ція,що дозволяє виво-дити в окремий файл: ios::flash() -виводить те,що в буфері.

Ostream&operator <<

(ostream&,MyType&)

ios::ostream&flash();

ostream(*f)(); //cтановимо замість MyType

ostream&operator<< (ostream&0,ostream&(*f)())

{return 0.(*f)();}

cout<<a<<b<<width(5)<<c; width(5)-це визов конструктора,що вертає об”єкт і через об2єкт викликає ф-цію

Виконаємо перевантаження:

ostream&operator<< (ostream&0,smanip&m)

{return m.f(m.i)}//дозволить викликати ф-цію і передати параметр.

Class smanip

{ostream&(*f)(int i);

int i;

smanip(ostream&(*f) (int i),int ii)f(ff),i(ii);}

class c

{public:

smanip&operator() (int ii);}

c width;

c::smanip&operator() (int ii)

{return smanip(les::width,ii);}

 

 



Поделиться:


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

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