• Nie Znaleziono Wyników

gawaiebiekweWykªad3. ky z eªieie zay iabiekóweaykwejeyów

N/A
N/A
Protected

Academic year: 2021

Share "gawaiebiekweWykªad3. ky z eªieie zay iabiekóweaykwejeyów"

Copied!
30
0
0

Pełen tekst

(1)

Wykªad 3. Konstruktory(uzupeªnienie), zas»y ia obiektów,

operatory,konwersjetypów

(2)

przypomnienie

Konstruktortospe jalna metodawywoªywana (automaty znie

lubjawnie)w momen ietworzenia obiektu.

Nazwakonstruktorajesttakajaknazwaklasy.

Konstruktornie zwra a warto± i,mo»e mie¢ argumenty,mo»e

by¢przeªadowany.

(3)

peªnaskªadnia

nazwa(argumenty) : lista_ini jaliza yjna

{

instruk je

}

Listaini jaliza yjna zawiera sekwen j ini jalizatorow.

Ini jalizatoremmo»eby¢:

atrybut(wyra»enie)

 zaini jalizowanieatrybutu(niestaty znego)warto± i¡

wyra»enia.

atrybut(lista_parametrów_konstruktora)

 zaini jalizowanieatrybutu(niestaty znego)zapomo ¡jego

konstruktora

(4)

ini jaliza jastaªej

lass A

{

onst int stala; // tu nie mo»na zaini jalizowa¢ staªej

A() : stala(0) // tylko tu mo»na zaini jalizowa¢ staª¡

{

// tu nie mo»na zaini jalizowa¢ staªej

}

};

(5)

ini jaliza jaatrybutuniebd¡ egostaª¡

lass A

{

int a,b, ; // tu nie mo»na zaini jalizowa¢

A() : a(1), (0) // mo»na tu

{

b=1; // albo tu

}

}

(6)

ini jaliza jaatrybutubd¡ egoreferen j¡

lass A

{

B& b;

A(B& bref) : b(bref)

{

// tu ju» nie mo»na manipulowa¢ warto± i¡ b

}

};

(7)

konstruk ja z± idziedzi zonejobiektu

lass A

{

int a;

A(int i) a(i) : { } // konstruktor w klasie A

}

lass B : publi A // B jest podklas¡ A

{

int b;

B(int i, int j) : A(i), // wywoªanie konstruktora nadklasy

b(j) // ini jaliza ja niedziedzi zonego atrybutu b

{ }

};

(8)

Jest tospe jalny konstruktor, konstuuj¡ yobiekt na podstawie

podanegojako argument wzor a.

Jego jedynyargument jesttypu referena jado obiektutej

samejklasy.

Konstruktorkopiuj¡ y zazwy zaj niemapotrzeby dokonywa¢

zmian we wzor u, dlategozwykle u»ywasi referen jido

obiektustaªego.

lass K

{

K(K& k) {...}

// lub K( onst K& k) {...}

(9)

przykªad

lass Osoba

{

har* imie;

Osoba( onst Osoba& o)

{

imie = new har[strlen(o.imie)+1℄;

str py(imie, o.imie);

}

};

W powy»szymprzykªadzie atrybutimiew nowym obiek iepowinien

wskazywa¢ nawªasn¡ kopiimienia. Automaty zniewygenerowany

konstruktorkopiuj¡ y skopiowaªby wska¹nik, o mogªoby mie¢

(10)

konstruktorkopiuj¡ ygenerowanyautomaty znie

Je±linie zdeniujemykonstruktora kopiuj¡ ego generowany

jeston automaty znie.

Automaty znie wygenerowany konstruktorkopiuj¡ y,kopiuje

obiekt skªadnik po skªadniku,z wykorzystaniem - tamgdzie

mamy do zynienie zobiektami- konstruktorówkopiuj¡ y hz

odpowiedni hklas.

W wikszo± iprzypadkow takikonstruktorkopiuj¡ y

wystar za.

(11)

wywoªaniejawne

Osoba o,o1; // o jest obiektem klasy Osoba

...

o1 = Osoba(o); // o1 ma by¢ kopi¡ obiektu o

(12)

wywoªanieniejawne

Konstruktorkopiuj¡ y jestniejawnie wywoªywany w dwó h

przypadka h:

kiedyobiekt jestprzekazywany jakoparametrfunk ji/metody

przezwarto±¢

kiedyfunk ja/metoda zwra a jakowarto±¢ obiekt

lass Osoba

{

...

Osoba sklonuj(Osoba o) // przekazanie obiektu przez warto±¢,

// do metody trafi kopia argumentu

{

Osoba o1 = Osoba(o);

return o1; // zwra ana jest kopia obiektu lokalnego o1

}

...

}

(13)

konstruktordomniemany

Konstruktordomniemany tokonstruktor, który mo»na

uru homi¢bez argumentów (mo»etoby¢konstruktorz

argumentami domy±lnymi).

Je±linie zdeniujemy»adnego konstruktora dlaklasy to ma

ona konstruktordomniemany wygenerowany automaty znie.

Je±lizdeniujemy konstruktor(y)inie bdziew±ródni h

takiego, którymo»na uru homi¢bezargumentów, toklasanie

makonstruktora domniemanego. Trzeba pamita¢,»ew

pewny h sytua ja h brak konstruktora domniemanego

powoduje bª¡d.

(14)

kolejno±¢wykonywaniadziaªa«

1. uru homienie konstruktora nadklasy(je±liklasajestklas¡

po hodn¡)

je±likonstruktorandklasy niewyminili±mynali± ie

ini jaliza yjnejuru hamiany jestkonstruktordomniemany

(bezargumentowy)

2. uru homienie konstruktorów obiektów skªadowy h

obiektyskªadowekonstruowanes¡zgodniez zawarto± i¡listy

ini jaliza yjnej

je±linali± ieini jaliza yjnejniewskazali±mykonstruktoradla

jakiego±obiektuskªadowego,uru hamianyjestjego

konstruktordomniemany(bezargumentowy)

3. wykonaniepozostaªy h zynno± izdeniowany h w iele

konstruktora

(15)

Tworzenieobiektówautomaty zny h

Obiekty automaty zne maj¡zakesbloku, istniej¡od momentu

deklara jido ko« abloku, wktórymzostaªyzadeklarowane.

lass A // jaka± klasa

{

...

A() {} // jej konstruktor bezargumentowy

A(int n) { ... } // i jej konstruktor z argumentem

};

int main()

{

...

{

A a; // deklara ja zm. z wywoªaniem konstruktora bezargumentowego

A b(5); // deklara ja zm. z wywoªaniem konstruktora z argumentem

...

} //tu ko« zy si zakres (i »ywot) a i b

...

(16)

Tworzenieobiektówglobalny h

Obiekty globalnemaj¡zakres pliku,istniej¡przez aªy zas

wykonywania programu. S¡ tworzone przedrozpo z iem

wykonywania funk ji main, ko« z¡ »ywot pojejzako« zeniu.

lass A // jaka± klasa

{

...

A() {} // jej konstruktor bezargumentowy

A(int n) { ... } // i jej konstruktor z argumentem

};

A a;

int main()

{

...

}

(17)

Dynami znetworzenieobiektów

Obiekt dynami zny istniej¡od momentujegoutworzenia za

pomo ¡operatora new do momentujegoznisz zenia operatorem

delete. Jestdostpny je±liistniejeijestdostpna jaka± zmienna

prze howyj¡ a wska¹nik doniego.

lass A // jaka± klasa

{

...

A() {} // jej konstruktor bezargumentowy

A(int n) { ... } // i jej konstruktor z argumentem

...

};

int main()

{

A* a = new A; // new A przydziela pami¢ na obiekt klasy A

// i zwra a wska¹nik do niego, obiekt jest

// tworzony przez konstruktor bezargumentowy

B* b = new A(5); // j.w. ale zadzaiªa konstruktor z argumentem

...

delete a; // utworzony dynami znie obiekt TRZEBA ZNISZCZY‚

delete b; // kiedy jest ju» niepotrzebny

(18)

Tworzenieobiektów hwilowy h

Konstruktormo»na wywoªa¢ jawnie tak,jakby byªzwykª¡

funk j¡ zwra aj¡ ¡ obiekt. Obiekt takijest' hwilowy' (=

istniej¡ y tylko wobrbie wyra»eniaw którymgo utworzono).

U»y ie obiektów hwilowy h przypomina u»y iestaªy h

dosªowny h (literaªów),jak 13.5 'A'"Alamakota"

(19)

Tworzenieobiektów hwilowy h: przykªad

lass A // jaka± klasa

{

...

A() { } // jej konstruktor bezargumentowy

A(int n) { ... } // i jej konstruktor z argumentem

A f() // jaka± metoda zwra aj¡ a obiekt klasy A

{

...

return A(0); // jawne wywoªanie konstruktora tworzy obiekt

// hwilowy, który jest zwra any przez metod

}

};

int main()

{

A a = A(); // obiekt hwilowy zwró ony przez konstruktor jest

// przypisywany zmiennej a;

A b;

b = A(3); // j.w. (zmiennej b)

a = f(); // obiekt hwilowy zwró ony przez f() jest przypisywany

// zmiennej a

(20)

W jzyku C++mamymo»liwo±¢deniowaniaoperatorów.

Te hni znie, polega tona przeªadowaniu istniej¡ y h

operatorów, zdeniowaniu i h dziaªaniadlainny h typów

argumentów.

Operatory mo»nadeniowa¢jako metodyklasy lubjako

funk je nazewn¡trzklasy. Deni jeoperatorów maj¡posta¢

tak¡ sam¡jakdeni je metod/funk ji,z t¡ró»ni ¡, »ew

mies unazwy metody/funk ji piszemy:

operatorX

gdzieXjest jednym zoperatorów:

+ - * / % ^ & | ~ ! = < >

+= -= *= /= %= ^= &= |= <<  = <<=

== != <= >= && || ++  , ->* ->

new delete () [℄

(21)

przykªad:deni jaoperatoradwuargumentowego

lass Zespolona {

publi :

float re, im;

Zespolona() : re(0), im(0) { }

Zespolona(float r, float i) : re(r), im(i) { }

//defini ja operatora w posta i metody:

Zespolona operator+(Zespolona z) { return Zespolona(re+z.re, im+z.im); }

};

// defini ja operatora w posta i funk ji

Zespolona operator-(Zespolona z1, Zespolona z2)

{ return Zespolona(z1.re+z2.re, z1.im+z2.im); }

int main() {

Zespolona a(1,2), b(3,0), , d

= a + b;

d = - Zespolona(1,0);

}

(22)

deni jaoperatorajednoargumentowegopreksowego

lass Zespolona {

...

Zespolona operator-() { return Zespolona(-re,im); }

};

Zespolona operator-(Zespolona z) { return Zespolona(-z.re,im); }

(23)

operatorprzypisania

Operatorprzypisania mastatussz zególny. Jestjedyn¡

niedziedzi zon¡metod¡klasy(pozakonstruktoramiidestruktorem).

lass K

{

K& operator=(K& k) {...}

// lub K& operator=( onst K& k) {...}

}

Czsto stosowan¡praktyk¡ jestzabezpie zanie argumentu

operatora przypisania przedmo»liwo± i¡modyka jiZAWSZE.

(Niekonsekwentne stosowanie onstprowadzido kªopotów).

(24)

operatorprzypisaniagenerowanyautomaty znie

Je±linie zdeniujemyoperatora przypisania generowany jeston

automaty znie.

Automaty znie wygenerowany operatorprzypisania,dokonuje

przypisania skªadnikpo skªadniku,z wykorzystaniem - tam

gdziemamy do zynienie zobiektami- operatorów przypisania

z odpowiedni h klas.

W wikszo± iprzypadkow takioperatorprzypisania wystar za.

(25)

operatorprzypisania: przykªad

lass Osoba

{

...

Osoba& operator=( onst Osoba& o)

{

if(imie!=NULL) // je±li obiekt ma imie

delete[℄ o.imie; // znisz z stare imie (zwolnij pami¢)

imie = new har[strlen(o.imie)+1℄; // zdob¡d¹ pami¢ na nowe imie

str py(imie, o.imie); // i przekopiuj je tam

}

...

publi :

har* imie;

}

(26)

przeªadowanieoperatora<<dlastumieniawyj± iowego

#in lude<iostream>

using namespa e std;

lass Zespolona {

publi :

Zespolona(double r, double i) : _re(r), _im(i) {}

double re() { return _re; }

double im() { return _im; }

private:

double _re,_im;

};

ostream& operator<<(ostream& os, Zespolona z) {

os << "(" << z.re() << "," << z.im() << ")";

return os;

}

int main() {

Zespolona z(1, 2.5);

out << z; // na wyj± iu: (1,2.5)

(27)

W jzyku C++programista mo»e zdeniowa¢ reguªykonwersji

typów jakiemaj¡ by¢ stosowane dla obiektówklasprzez niego

deniowany h.

Zdeniowane wten sposóbkonwersjemog¡by¢u»yte jawnie,

z wykorzystaniem operatora konwersji (typ).

S¡ te»u»ywane niejawnie przezkompilatorw trak ie

dopasowywania wywoªaniafunk ji/metody,stanowi¡

uzupeªnienie konwersji predeniowany h.

(28)

konwersjazdeniowanaprzezkonstruktor

Konstruktorz jednym argumentemokre±lakonwersjz typu tego

argumentunatypswojejklasy.

lass Zespolona

{

...

Zespolona(double f) re(f), im(0) : { } // konwersja z double na Zespolona

...

private:

double re,im;

};

int main()

{

Zespolona z1,z2,z3;

z1 = Zespolona(2.5); // zwykªe wywoªanie konstruktora

z2 = (Zespolona)0; // jawnie wywoªana konwersja

z3 = 5.0; // niejawna konwersja z double na Zespolona

z4 = 5; // int -> double -> Zespolona

(29)

konwersjazdeniowanaprzezoperatorkonwersji

Operatorbezargumentowy T(),którego nazwa Tjestnazw¡typu

defninuje konwersjez typu swojejklasy natypT.

lass Zespolona

{

...

operator double() { return re; } // konwersja z Zespolona na double

...

private:

float re,im;

};

int main()

{

Zespolona z(1,-1.5);

double x = (double)z; // jawna konwersja

double y = z; // niejawna konwersja z Zespolona na double

out << z; // niejawna konwersja z Zespolona na double

(30)

UWAGA!

Przy deniowaniu konwersji trzebaza howa¢ ostro»no±¢:

je±likomiplatornapotka niejednozna zno±¢(bdziemógªdokona¢

konwersji nawi ejni» jeden sposób) zgªosi bª¡d.

lass Zespolona

{

...

operator double() { return re; } // konwersja z Zespolona na double

operator int() { return (int)re; } // konwersja z Zespolona na int

...

private:

float re,im;

};

int main()

{

Zespolona z(1,-1.5);

double x = (double)z; // jawna konwersja

double y = z; // niejawna konwersja z Zespolona na double

out << z; // bª¡d! Zespolona->double zy Zespolona->int ?

Cytaty

Powiązane dokumenty

udając się na łow iska M orza Północnego w pełnej gotowości technicznej.. potrzeb rem

Podstawowe poj ia teorii ubezpie ze« »y iowy h: strata, rezerwa, wa-2. rian

nych i szczelnych zasłon z ładnego kretonu lub szarego płótna... rzutnik czy zwijany ekran, epidiaskop, radio, telewizor, należy przewidzieć miejsce do ich

dotyczące definicji mikroprzedsiębiorstw oraz małych i średnich przedsiębiorstw (Dz.U. Te informacje są wymagane wyłącznie do celów statystycznych.

Badania nad rolą w biocenozie chrząszczy z rodziny biegaczowa- tych w yjaśniły ich znaczenie jako regulatora w rozradzaniu się szkodliwych

serw acji w odniesieniu do K siężyca daje jego terminator (linia, gdzie przylegają do siebie oświetlona przez Słońce i nie ośw ietlona część tarczy). Istnienie

Opiekuj się pan mym chłopcem, daj mu możność pójść w życiu naprzód, jeżeli rząd nie zechce tego uczynić... Zaremba przedstaw ia rozprawę

Kronika