POwyklad4

background image

Tomasz Marks - Wydział MiNI PW

-1-

Programowanie Obiektowe

(j

ę

zyk C++)

Wykład 4.

Tomasz Marks - Wydział MiNI PW

-2-

operatory jako funkcje

vs

operatory jako metody

Tomasz Marks - Wydział MiNI PW

-3-

Operator jako funkcja vs metoda [0]

class CMPLX
{

......................................

......................................

public:

......................................
// operatory dwuargumentowe ( metody )

CMPLX

operator-

( CMPLX );

......................................

......................................

// operatory dwuargumentowe ( funkcje zaprzyja

ź

nione )

friend CMPLX

operator+

( CMPLX, CMPLX );

......................................

};

Tomasz Marks - Wydział MiNI PW

-4-

Operator jako funkcja vs metoda [1]

a

// operator + / funkcja zaprzyja

ź

niona (definicja)

CMPLX operator+ ( CMPLX a, CMPLX b )
{

CMPLX c;
c.Re = a.Re + b.Re; c.Im = a.Im + b.Im;
return c;

}

// operator - / metoda (definicja)

CMPLX CMPLX::operator- ( CMPLX b ) const
{

CMPLX c;
c.Re = Re - b.Re; c.Im = Im - b.Im;
return c;

}

background image

Tomasz Marks - Wydział MiNI PW

-5-

Operator jako funkcja vs metoda [1a]

// operator + / funkcja zaprzyja

ź

niona (definicja)

CMPLX operator+ ( CMPLX a, CMPLX b )
{

CMPLX c ( a.Re + b.Re, a.Im + b.Im );
return c;

}

// operator - / metoda (definicja)

CMPLX CMPLX::operator- ( CMPLX b ) const
{

CMPLX c ( Re - b.Re, Im - b.Im );
return c;

}

Tomasz Marks - Wydział MiNI PW

-6-

Operator jako funkcja vs metoda [1b]

// operator + / funkcja zaprzyja

ź

niona (definicja)

CMPLX operator+ ( CMPLX a, CMPLX b )
{

return CMPLX ( a.Re + b.Re, a.Im + b.Im );

}

// operator - / metoda (definicja)

CMPLX CMPLX::operator- ( CMPLX b ) const
{

return CMPLX ( Re - b.Re, Im - b.Im );

}

Tomasz Marks - Wydział MiNI PW

-7-

Przypomnienie ...

• Ka

ż

da metoda niestatyczna ma dost

ę

p

do wska

ź

nika na obiekt, na rzecz

którego zostanie wywołana.

• Wska

ź

nik ten wyra

ż

any jest słowem

kluczowym

this

.

Tomasz Marks - Wydział MiNI PW

-8-

Operator jako funkcja vs metoda [2]

// operator + / metoda (definicja)

CMPLX CMPLX::operator+ ( CMPLX b ) const
{

CMPLX c;
c.Re = Re + b.Re;

c.Im = Im + b.Im;

return c;

}

// RÓWNOWA

ś

NE

// operator + / metoda (definicja)

CMPLX CMPLX::operator+ ( CMPLX b ) const
{

CMPLX c;
c.Re =

this->

Re + b.Re;

c.Im =

(*this).

Im + b.Im;

return c;

}

background image

Tomasz Marks - Wydział MiNI PW

-9-

Operator jako funkcja vs metoda [3]

CMPLX A, B, C;

// operator + / funkcja zaprzyja

ź

niona (u

ż

ycie)

C = A + B;

// albo

C = operator+ ( A, B );

// operator - / metoda (u

ż

ycie)

C = A - B;

// albo

C = A.operator- ( B );

Tomasz Marks - Wydział MiNI PW

-10-

Operator jako funkcja vs metoda [4]

CMPLX A, B, C;

// operator + / funkcja zaprzyja

ź

niona (u

ż

ycie)

C = A + B;

// o.k.

C = A + 5.2;

// o.k. równowa

ż

ne

C = operator+ ( A, 5.2 );

// równowa

ż

ne

C = operator+ ( A, CMPLX ( 5.2 ) );

C = 5.2 + A;

// o.k. równowa

ż

ne

C = operator+ ( 5.2, A );

// równowa

ż

ne

C = operator+( CMPLX ( 5.2 ), A );

// operator - / metoda (u

ż

ycie)

C = A - B;

// o.k.

C = A - 5.2;

// o.k. równowa

ż

ne

C = A.operator- ( 5.2 );

// równowa

ż

ne

C = A.operator- ( CMPLX ( 5.2 ) );

C = 5.2 - A;

//

Ź

LE

równowa

ż

ne

C = (5.2).operator- ( A );

// metoda musi działa

ć

na rzecz obiektu klasy!!!

Tomasz Marks - Wydział MiNI PW

-11-

Operator przypisania dla klasy CMPLX [1]

Je

ż

eli zdecydujemy si

ę

zadeklarowa

ć

własny operator przypisania

class CMPLX

{

……………………….

public:

CMPLX& operator= ( const CMPLX& );

……………………….

};

to musimy poda

ć

jego implementacj

ę

(definicj

ę

).

Tomasz Marks - Wydział MiNI PW

-12-

Operator przypisania dla klasy CMPLX [2]

N.p.

CMPLX& CMPLX::operator= ( const CMPLX& rhs )
{

Re = rhs.Re;
Im = rhs.Im;
return *this;

}

albo

CMPLX& CMPLX::operator= ( const CMPLX& rhs )
{

if ( this != &rhs )
{

Re = rhs.Re;
Im = rhs.Im;

}
return *this;

}

background image

Tomasz Marks - Wydział MiNI PW

-13-

Jeszcze o u

ż

yciu słowa kluczowego this

CMPLX::CMPLX ( double re, double im )

{

Re = re; Im = im;

// o.k.

}

CMPLX::CMPLX ( double Re, double Im )

{

Re = Re; Im = Im;

//

Ź

LE:

nazwy parametrów

}

// przesłaniaj

ą

nazwy pól

CMPLX::CMPLX ( double Re, double Im )

{

this

->Re = Re;

this

->Im = Im;

// o.k.

}

Tomasz Marks - Wydział MiNI PW

-14-

Operator indeksowy dla klasy CMPLX [1]

class CMPLX
{

……………………….

public:

// zamiast 4 prymitywnych metod dost

ę

powych

double getRe () const { return Re; }
double getIm () const { return Im; }
void setRe ( double re ) { Re = re; }
void setIm ( double im ) { Im = im; }

// lub 2 metod referencyjnych

double& refRe () { return Re; }
double& refIm () { return Im; }

// mo

ż

na zdefiniowa

ć

1 metod

ę

opisuj

ą

c

ą

operator indeksowy

double& operator [ ] ( int i ) { return i ? Im : Re; }

……………………….

};

Tomasz Marks - Wydział MiNI PW

-15-

Operator indeksowy dla klasy CMPLX [2]

{

……………………….

CMPLX A, B, C, T[5];

……………………….

C[0] = max ( A[0], A[1] );

// wyra

ż

a: C.Re = max ( A.Re, A.Im );

C[1] = B[1] - A[0];

// wyra

ż

a:

C.Im = B.Im - A.Re;

T[4][0] = 2.5;

// wyra

ż

a:

T[4].Re = 2.5;

Tomasz Marks - Wydział MiNI PW

-16-

Operatory ++ i -- dla klasy CMPLX

class CMPLX

{

……………………….
// funkcje zaprzyja

ź

nione

friend CMPLX& operator++ ( CMPLX& );

// przedrostkowy

friend CMPLX operator++ ( CMPLX&, int );

// przyrostkowy

……………………….

public:

……………………….

// metody

CMPLX& operator-- ( );

// przedrostkowy

CMPLX operator-- ( int );

// przyrostkowy

……………………….

};

background image

Tomasz Marks - Wydział MiNI PW

-17-

// cmplx.cpp

// funkcje zaprzyja

ź

nione

CMPLX& operator++ ( CMPLX& z )

// przedrostkowy

{

z.Re++;
return z;

// zwraca referencj

ę

}
CMPLX operator++ ( CMPLX& z, int )

// przyrostkowy

{

CMPLX old( z.Re++, z.Im );
return old;

// zwraca nowy obiekt

}

// metody

CMPLX& CMPLX::operator-- ( )

// przedrostkowy

{

--Re;
return *this;

// zwraca referencj

ę

}
CMPLX CMPLX:: operator-- ( int )

// przyrostkowy

{

CMPLX old( Re--, Im );
return old;

// zwraca nowy obiekt

}

Tomasz Marks - Wydział MiNI PW

-18-

new i delete

Tomasz Marks - Wydział MiNI PW

-19-

PRZYPOMNIENIE:

Operatory new i delete [1]

int A;
static int B;
extern int C;

void fun ( int a )
{

int b, *p, *q;

static int c;
extern int D;

b = a;

p = new int;

// utworzenie zmiennej *p (warto

ść

0)

q = new int ( 4 );

// utworzenie zmiennej *q (warto

ść

4)

*p = 5; *q = 6;

delete p;

// zmienna *p "znika"

return;

// zmienna *q pozostanie niedost

ę

pny

}

Tomasz Marks - Wydział MiNI PW

-20-

Operatory new i delete [2]

CMPLX A;
static CMPLX B;
extern CMPLX C;

void fun ( CMPLX a )
{

CMPLX b, *p, *q;

static CMPLX c;
extern CMPLX D;

b = a;

p = new CMPLX;

// utworzenie obiektu *p (konstruktor bezparametrowy)

q = new CMPLX ( 2.5, 3.5 );

// utworzenie obiektu *q (konstruktor 2-parametrowy)

*p = 5; *q = 6;

delete p

;

// obiekt *p "znika" (destruktor)

return;

// obiekt *q pozostanie niedost

ę

pny

}

background image

Tomasz Marks - Wydział MiNI PW

-21-

Operatory new i delete [3]

void fun ( CMPLX a )
{

int tab_i [ 5 ], *p;
CMPLX tab_C [ 5 ], *q;

p = new int [ 5 ];

// utworzenie tablicy o 5 elementach typu int
//

p[0], p[1], p[2], p[3], p[4]

q = new CMPLX [ 5 ];

// utworzenie tablicy o 5 elementach typu CMPLX

//

q[0], q[1], q[2], q[3], q[4]

……………………….
……………………….

delete [ ] p;

// wszystkie elementy (zmienne)
// tablicy wskazywanej przez p "znikaj

ą

"

delete [ ] q;

// wszystkie elementy (obiekty)
// tablicy wskazywanej przez q "znikaj

ą

" (destruktor)

return;

}

Tomasz Marks - Wydział MiNI PW

-22-

Operatory new i delete [4]

Operator new mo

ż

e te

ż

przyjmowa

ć

inne postaci, n.p.

Class *p, *q;

……………………….

p = new ( Placement ) Class;

// utworzenie obiektu

q = new ( Placement ) Class [ 5 ];

// utworzenie tablicy obiektów

……………………….

gdzie Placement jest list

ą

argumentów okre

ś

lonych w przeci

ąż

eniu operatora

new dla klasy Class.

Tego tematu nie b

ę

dziemy rozwija

ć

.

Tomasz Marks - Wydział MiNI PW

-23-

globalne / lokalne

statyczne / dynamiczne

Tomasz Marks - Wydział MiNI PW

-24-

PRZYPOMNIENIE:

Zmienne globalne / lokalne

int A;

// definicja zmiennej globalnej A

static int B;

// definicja zmiennej B lokalnej w tre

ś

ci pliku

extern int C;

// deklaracja zmiennej globalnej C zdefiniowanej

// by

ć

mo

ż

e w innym pliku

void fun ( int a )

// parametr a jest zmienn

ą

lokaln

ą

w tre

ś

ci funkcji

{

int b, *p, *q;

// definicja zmiennych b, p, q lokalnych w tre

ś

ci funkcji

static int c;

// definicja zmiennej c lokalnej w tre

ś

ci funkcji

extern int D;

// deklaracja zmiennej globalnej D zdefiniowanej

// by

ć

mo

ż

e w innym pliku

b = a;
p = new int;

// utworzenie zmiennej *p (warto

ść

0)

q = new int(4);

// utworzenie zmiennej *q (warto

ść

4)

*p = 5; *q = 6;

delete p;

// zmienna *p "znika"

return;

// zmienne a, b, p, q "znikaj

ą

",

// zmienna c zachowuje swoj

ą

warto

ść

// zmienna *q zachowuje swoj

ą

warto

ść

, ale pozostanie niedost

ę

pna

}

background image

Tomasz Marks - Wydział MiNI PW

-25-

PRZYPOMNIENIE:

Zmienne statyczne / dynamiczne

int A;

// statyczna (warto

ść

0)

static int B;

// statyczna (warto

ść

0)

extern int C;

// statyczna (warto

ść

nieznana)

void fun ( int a )

// dynamiczna (automatyczna) (warto

ść

okr. argumentem)

{

int b, *p, *q;

// dynamiczne (automatyczne) (warto

ś

ci nieokre

ś

lone)

static int c;

// statyczna (warto

ść

0 przy pierwszym wywołaniu)

extern int D;

// statyczna (warto

ść

nieznana)

b = a;
p = new int;

// dynam. (kontrolowana) (warto

ść

0)

q = new int(4);

// dynam. (kontrolowana) (warto

ść

4)

*p = 5; *q = 6;

delete p;

// zmienna kontrolowana *p "znika"

return;

// zmienne automatyczne a, b, p, q "znikaj

ą

",

// zmienna statyczna c zachowuje swoj

ą

warto

ść

// zmienna kontr. *q zachowuje swoj

ą

warto

ść

, ale pozostanie niedost

ę

pna

}

Tomasz Marks - Wydział MiNI PW

-26-

Obiekty globalne / lokalne

CMPLX A;

// definicja obiektu globalnego A

static CMPLX B;

// definicja obiektu B lokalnego w tre

ś

ci pliku

extern CMPLX C;

// deklaracja obiektu globalnego C zdefiniowanego

// by

ć

mo

ż

e w innym pliku

void fun ( CMPLX a )

// parametr a jest obiektem lokalnym w tre

ś

ci funkcji

{

CMPLX b, *p, *q;

// definicja obiektu b i zmiennych p, q lokalnych w tre

ś

ci funkcji

static CMPLX c;

// definicja obiektu c lokalnego w tre

ś

ci funkcji

extern CMPLX D;

// deklaracja obiektu globalnego D zdefiniowanego

// by

ć

mo

ż

e w innym pliku

b = a;
p = new CMPLX;

// utworzenie obiektu *p (konstruktor bezparametrowy)

q = new CMPLX(2.5, 3.5);

// utworzenie obiektu *q (konstruktor 2-parametrowy)

*p = 5; *q = 6;

// równowa

ż

ne: *p = CMPLX(5,0); *q = CMPLX(6,0);

delete p;

// obiekt *p "znika"

return;

// obiekty a, b, p, q "znikaj

ą

",

// obiekt c zachowuje swoj

ą

warto

ść

// obiekt *q zachowuje swoj

ą

warto

ść

, ale pozostanie niedost

ę

pny

}

Tomasz Marks - Wydział MiNI PW

-27-

Obiekty statyczne / dynamiczne

CMPLX A;

// statyczny (konstruktor bezparametrowy)

static CMPLX B;

// statyczny (konstruktor bezparametrowy)

extern CMPLX C;

// statyczny (konstruktor nieznany)

void fun ( CMPLX a )

// dynamiczny (automatyczny) (konstruktor kopiuj

ą

cy)

{

CMPLX b, *p, *q;

// dynamiczny (automatyczny) b (konstruktor bezparametrowy)
// dynamiczne (automatyczne) p, q (warto

ś

ci nieokre

ś

lone)

static CMPLX c;

// statyczny (konstruktor bezparametrowy)

extern CMPLX D;

// statyczny (konstruktor nieznany)

b = a;
p = new CMPLX;

// dynam. (kontrolowany) (wart. okreslona konstruktorem bezp.)

q = new CMPLX(2.5,3.5);

// dynam. (kontrolowany) (wart. okreslona konstr. 2-par.)

*p = 5; *q = 6;

delete p;

// obiekt kontrolowany *p "znika"

return;

// obiekty automatyczne a, b i zmienne automatyczne p, q "znikaj

ą

",

// obiekt statyczny c zachowuje swoj

ą

warto

ść

// obiekt kontr. *q zachowuje swoj

ą

warto

ść

, ale pozostanie niedost

ę

pny

}

Tomasz Marks - Wydział MiNI PW

-28-

Koniec wykładu 4.


Wyszukiwarka

Podobne podstrony:
POwyklad2
POwyklad9
POwyklad3
POwyklad5
POwyklad10
Pedagogika przewlekle chorych powyklejane, Ważne dla sudenta, Studia pedagogika
POwyklad9
POwyklad2
POwyklad1
POwyklad6
POwyklad15 planowany
POwyklad4
POwyklad3
POwyklad7
POwyklad15 planowany
POwyklad1
POwyklad6
POwyklad2
POwyklad9

więcej podobnych podstron