Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
POO - Curs Doc-1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
868.86 Кб
Скачать
  1. Operatorii de inserţie şi extragere

Supraîncărcarea operatorilor de inserţie (<<) şi extragere (>>) în cadrul unei clase permite ca operaţiile de afişare şi citire a obiectelor să fie efectuate într-un mod similar ca şi a datelor de tipuri predefinite, adică:

cout << nume_obiect;

sau, respectiv:

cin >> nume_obiect;

Supraîncărcarea operatorilor de inserţie (<<) şi extragere (>>) în cadrul unei clase poate fi realizată doar prin metoda funcţiilor prietene. Fiindcă aceşti operatori inter-acţionează cu fluxurile de intrare şi de ieşire, funcţiile care realizează supraîncărcarea au un parametru fictiv, care reprezintă un obiect de tip flux. Operatorul de inserţie << este supraîncărcat pentru tipurile de date predefinite în clasa ostream, iar operatorul de extragere >> este supraîncărcat pentru tipurile predefinite în clasa istream. De aceea parametrii fictivi care reprezintă obiectul de tip flux vor fi anume de aceste tipuri. Clasa în care are loc supraîncărcarea operatorilor de inserţie şi extragere va conţine următoarele prototipuri de funcţii:

class nume_cl

{

. . .

friend ostream & operator <<(ostream &nume_flux, nume_cl ob);

friend istream & operator >>(istream &nume_flux, nume_cl &ob);

. . .

}

Primul parametru fictiv al ambelor funcţii reprezintă fluxul de intrare sau de ieşire, el fiind transmis prin referinţă, fiindcă fluxul în procesul operaţiei de intrare sau de ieşire se schimbă şi această schimbare trebuie să fie vizibilă şi în exteriorul funcţiei. Al doilea parametru fictiv reprezintă obiectul, care va fi afişat sau care va fi iniţializat cu date citite de la dispozitive de intrare. Pentru ca valoarea obiectului schimbat în procesul iniţializării să fie vizibilă în exteriorul funcţiei în care se produce schimbarea, parametrul este transmis prin referinţă. În cazul afişării, obiectul este transmis prin valoare, fiindcă la afişare obiectul nu-şi schimbă valoarea. Ambele funcţii returnează referinţa la fluxul corespunzător prelucrat. Implementarea operatorilor va avea forma:

ostream & operator <<(ostream &nume_flux, nume_cl ob)

{

.

. // instructiuni

.

}

şi

istream & operator >> (istream &nume_flux, nume_cl &ob)

{

.

. // instructiuni

.

}

Vom supraîncărca aceşti operatori pentru clasa complex:

class complex

{

. . .

friend ostream & operator << (ostream &fluxIes, complex c);

friend istream & operator >> (istream &fluxIn, complex &c);

. . .

};

ostream & operator << (ostream & fluxIes, complex c)

{

if (c.i == 0)

fluxIes << a.r ;

else

if (c.r == 0)

fluxIes << c.i << "i" ;

else

fluxIes << c.r << setiosflags(ios::showpos)

<< c.i << "i"

<< resetiosflags(ios::showpos);

return fluxIes;

}

istream & operator >> (istream &fluxIn, complex &c)

{

fluxIn >> c.r ;

fluxIn >> c.i ;

return fluxIn;

}

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