POwyklad3

background image

Tomasz Marks - Wydział MiNI PW

-1-

Programowanie Obiektowe

(j

ę

zyk C++)

Wykład 3.

Tomasz Marks - Wydział MiNI PW

-2-

predefiniowane

konstruktory,

destruktor

i operator przypisania

Tomasz Marks - Wydział MiNI PW

-3-

Predefiniowane konstruktory, destruktor

i operator przypisania

// cmplx.h

class CMPLX
{

double Re, Im;

public:

// konstruktor bezparametrowy

CMPLX ( );

// konstruktor kopiuj

ą

cy

CMPLX ( const CMPLX& );

// destruktor

~CMPLX ( );

// operator przypisania

CMPLX& operator= ( const CMPLX& );

void Set (double=0, double=0 );
void Read ( );
void Write ( ) const;
double Abs ( ) const;
friend CMPLX operator+ ( CMPLX, CMPLX );

};

Tomasz Marks - Wydział MiNI PW

-4-

Predefiniowane konstruktory, destruktor

i operator przypisania

// ilustracja realizacji metod predefiniowanych
……………….

// konstruktor bezparametrowy

CMPLX ::CMPLX ( ) { }

// konstruktor kopiuj

ą

cy

CMPLX :: CMPLX ( const CMPLX& arg ) { Re = arg.Re; Im = arg.Im; }

// destruktor

CMPLX :: ~CMPLX ( ) { }

// operator przypisania

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

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

this

;

}

background image

Tomasz Marks - Wydział MiNI PW

-5-

Do zapami

ę

tania…

• 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

.

• Wyra

ż

enie

*this

oznacza obiekt, na

rzecz którego 'pracuje' metoda.

Tomasz Marks - Wydział MiNI PW

-6-

nasze

konstruktory

i destruktor

Tomasz Marks - Wydział MiNI PW

-7-

Konstruktory i destruktor (1)

// cmplx.h

class CMPLX
{

double Re, Im;

public:

CMPLX ( );
CMPLX ( const CMPLX& );
CMPLX ( double, double );
CMPLX ( double );
~CMPLX ( );

void Set (double=0, double=0 );

void Read ( );
void Write ( ) const;
double Abs ( ) const;
friend CMPLX operator+ ( CMPLX, CMPLX );

};

Tomasz Marks - Wydział MiNI PW

-8-

Konstruktory i destruktor (2)

// cmplx.cpp
……………….

// konstruktor bezparametrowy

CMPLX ::CMPLX ( ) { Re = Im = 0; }

// konstruktor kopiuj

ą

cy

CMPLX :: CMPLX ( const CMPLX& arg ) { Re = arg.Re; Im = arg.Im; }

// konstruktor 2-parametrowy (double,double)

CMPLX :: CMPLX ( double re, double im ) { Re = re; Im = im; }

// konstruktor 1-parametrowy (double)

CMPLX :: CMPLX ( double re ) { Re = re; Im = 0; }

// destruktor

CMPLX :: ~CMPLX ( ) { }

background image

Tomasz Marks - Wydział MiNI PW

-9-

Konstruktory i destruktor (3)

{

CMPLX a;

// u

ż

ycie konstr. bezparametrowego

a.Write( );

// ( 0, 0 )

a.Set(2, 1.5);
a.Write( );

// ( 2, 1.5 )

CMPLX b(3.2, 5.3);

// u

ż

ycie konstr. (double,double)

b.Write() ;

// ( 3.2, 5.3 )

CMPLX c(4.1);

// u

ż

ycie konstr. (double)

c.Write( );

// ( 4.1, 0 )

CMPLX d(a), e=b;

// u

ż

ycie konstr. kopiuj

ą

cego

d.Write( );

// ( 2, 1.5 ), jak a

e.Write( );

// ( 3.2, 5.3 ), jak b

}

// dla ka

ż

dego obiektu utworzonego w bloku

// zostanie (niejawnie) wywołany destruktor

Tomasz Marks - Wydział MiNI PW

-10-

Konstruktory i destruktor (4)

UWAGA!!!

CMPLX f( );

To

nie jest

deklaracja obiektu f z u

ż

yciem kostruktora

bezparametrowego.

To

jest

deklaracja bezparametrowej funkcji f zwracaj

ą

cej

warto

ść

typu CMPLX.

Tomasz Marks - Wydział MiNI PW

-11-

Konstruktory i destruktor dla klasy Class

(1) Konstruktory / destruktor zwracaj

ą

typ void, ale

przy ich deklaracji / definicji słowa void nie
piszemy.

(2) Nazw

ą

ka

ż

dego konstruktora jest Class,

kostruktorów mo

ż

e by

ć

wiele.

(3) Nazw

ą

destruktora jest ~Class, destruktor jest

tylko jeden.

(4) Je

ż

eli nie zdefiniowano

ż

adnego konstruktora, to

kompilator doł

ą

czy do definicji klasy konstruktor

bezparametrowy o pustej tre

ś

ci.

Tomasz Marks - Wydział MiNI PW

-12-

Konstruktory i destruktor klasy Class

(5) Je

ż

eli nie zdefiniowano destruktora, to kompilator

doł

ą

czy do definicji klasy destruktor o pustej tre

ś

ci.

(6) Je

ż

eli zdefiniowano jakikolwiek konstruktor, to

konstruktor bezparametrowy b

ę

dzie dost

ę

pny tylko

wtedy, gdy jawnie b

ę

dzie zdefiniowany konstruktor

daj

ą

cy si

ę

wywoła

ć

bez parametrów.

(7) Kompilator dostarcza równie

ż

domy

ś

lny konstruktor

kopiuj

ą

cy o deklaracji

Class ( const Class& );

Wykonuje on kopi

ę

ka

ż

dej zmiennej wewn

ę

trznej

obiektu

ź

ródłowego i umieszcza w nowym obiekcie

(tzw. kopiowanie płytkie).

background image

Tomasz Marks - Wydział MiNI PW

-13-

Konstruktory i destruktor dla klasy Class

(8) Konstruktor kopiuj

ą

cy jest wywoływany, gdy

tworzony jest obiekt danej klasy, który ma by

ć

kopi

ą

zadanego obiektu tej klasy. Ma to miejsce

n.p. gdy

- opracowywana jest deklaracja z inicjatorem,

- obiekt jest przekazywany do funkcji

jako argument (przez warto

ść

),

- obiekt jest zwracany jako warto

ść

funkcji.

Tomasz Marks - Wydział MiNI PW

-14-

Konstruktory [1]

// cmplx.h

class CMPLX
{

double Re, Im;

public:

CMPLX ( );

CMPLX ( const CMPLX& );

CMPLX ( double, double );
CMPLX ( double );

~CMPLX ( );
void Set (double=0, double=0 );
void Read ( );
void Write ( ) const;
double Abs ( ) const;
friend CMPLX operator+ ( CMPLX, CMPLX );

};

Tomasz Marks - Wydział MiNI PW

-15-

Konstruktory [2]

// cmplx.h

class CMPLX
{

double Re, Im;

public:

CMPLX ( const CMPLX& );

CMPLX ( double=0, double=0 );

~CMPLX ( );
void Set (double=0, double=0 );
void Read ( );
void Write ( ) const;
double Abs ( ) const;
friend CMPLX operator+ ( CMPLX, CMPLX );

};

Tomasz Marks - Wydział MiNI PW

-16-

Metody i funkcje (deklaracje)

// cmplx.h

class CMPLX
{

double Re, Im;

public:

CMPLX ( const CMPLX& );
CMPLX ( double=0, double=0 );
~CMPLX ( );
............................
double Abs ( ) const;

void

Read

( );

// metoda

void

Write

( ) const;

// metoda

friend CMPLX

Add

( CMPLX, CMPLX );

// fun. zaprzyja

ź

niona

};

background image

Tomasz Marks - Wydział MiNI PW

-17-

Metody i funkcje (definicje)

// cmplx.cpp

……………….

// metoda Read

void CMPLX ::

Read

( )

{

cin >> Re >> Im;

}

// metoda Write

void CMPLX ::

Write

( ) const

{

cout << "(" << Re << ''," << Im << ")" << endl;

}

// funkcja zaprzyja

ź

niona Add

CMPLX

Add

( CMPLX a, CMPLX b )

{

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

}

Tomasz Marks - Wydział MiNI PW

-18-

Metody i funkcje (u

ż

ycie)

// myprog.cpp

……………….

……………….

{

CMPLX a, b, c;

a.Read( );

b.Read( );

c = Add(a, b);

c.Write( );

……………….

Tomasz Marks - Wydział MiNI PW

-19-

Funkcje / Operatory (deklaracje)

// cmplx.h

#include <iostream>

class CMPLX
{

double Re, Im;

public:

CMPLX ( const CMPLX& );
CMPLX ( double=0, double=0 );
~CMPLX ();
double Abs () const;

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

// operatory / funkcje zaprzyja

ź

nione

friend CMPLX

operator+

( CMPLX, CMPLX );

friend istream&

operator>>

(istream&, CMPLX&);

friend ostream&

operator<<

(ostream&, const CMPLX&);

};

Tomasz Marks - Wydział MiNI PW

-20-

Funkcje / Operatory (definicje)

// cmplx.cpp
……………….

// operator

+

/ funkcja zaprzyja

ź

niona

CMPLX

operator+

( CMPLX a, CMPLX b )

{

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

}

// operator

>>

/ funkcja zaprzyja

ź

niona

istream&

operator>>

( istream& inp, CMPLX& z )

{

inp >> z.Re >> z.Im;
return inp;

}

// operator

<<

/ funkcja zaprzyja

ź

niona

ostream&

operator<<

( ostream& out, const CMPLX& z )

{

out << "(" << z.Re << ''," << z.Im << ")" << endl;
return out;

}

background image

Tomasz Marks - Wydział MiNI PW

-21-

Funkcje / Operatory (u

ż

ycie) [1]

// myprog.cpp

……………….

……………….

{

CMPLX a, b, c;

cin >> a;

cin >> b;

c = a + b;

cout << c;

……………….

Tomasz Marks - Wydział MiNI PW

-22-

Funkcje / Operatory (u

ż

ycie) [2]

// myprog.cpp

……………….

……………….

{

CMPLX a, b, c;

cin >> a >> b;

c = a + b;

cout << c;

……………….

Tomasz Marks - Wydział MiNI PW

-23-

Funkcje / Operatory (u

ż

ycie) [3]

// myprog.cpp

……………….

……………….

{

CMPLX a, b;

cin >> a >> b;

cout << a + b;

……………….

Tomasz Marks - Wydział MiNI PW

-24-

Funkcje / Operatory (u

ż

ycie) [4]

// myprog.cpp

……………….

……………….

{

CMPLX a, b;

operator>> (

operator>>(cin,a),

b

);

operator<< (

cout

,

operator+(a,b)

);

……………….

background image

Tomasz Marks - Wydział MiNI PW

-25-

Funkcje / Operatory (u

ż

ycie) [5]

// myprog.cpp
……………….
……………….

{

CMPLX a(2.5), b(1,3), c(a), T[5];

// a, b, c – obiekty klasy CMPLX (typu CMPLX)
// T[5] – tablica 5 obiektów klasy CMPLX

T[ 0 ] = a; T[ 1 ] = b;
int i;
for ( i = 2; i < 5; ++i ) cin >> T[ i ];
CMPLX s;
for ( int j = 0; j < 5; ++j ) s = s + T[ j ];
cout << s;

……………….

Tomasz Marks - Wydział MiNI PW

-26-

UWAGA:

Pojedyncze obiekty

(a, b, c)

mog

ą

by

ć

inicjowane

dowolnymi konstruktorami.

Wszystkie elementy tablicy

(T[0], T[1], T[2], T[3], T[4])

s

ą

inicjowane konstruktorem bezparametrowym i nie ma tu

innej mo

ż

liwo

ś

ci.

Tomasz Marks - Wydział MiNI PW

-27-

OPERATORY

Tomasz Marks - Wydział MiNI PW

-28-

Zestawienie operatorów

lewa

<< >>

12

lewa

+ -

(dwuargumentowe)

13

lewa

.* ->*

15

lewa

* / %

14

prawa

++ --

(przedrostkowe)

-

+ * &

(jednoargumentowe)

new delete

(typ) sizeof ~ !

16

prawa

++ --

(przyrostkowe)

. -> [ ] ( ) typ

typeid

dynamic_cast static_cast

reinterpret_cast const_cast

17

lewa

::

18

Ł

ą

cz.

Operatory

Pr.

background image

Tomasz Marks - Wydział MiNI PW

-29-

Zestawienie operatorów c.d.

lewa

< <= > >=

11

lewa

,

1

prawa

throw

2

prawa

= @=

( @ oznacza * / % + - << >> & | ^ )

3

lewa

? :

4

lewa

||

5

lewa

&&

6

lewa

|

7

lewa

&

9

lewa

^

8

lewa

== !=

10

Ł

ą

cz.

Operatory

Pr.

Tomasz Marks - Wydział MiNI PW

-30-

Definiowanie operatorów [1]

(1)

Mo

ż

na deklarowa

ć

funkcje/metody definiuj

ą

ce

znaczenie nast

ę

puj

ą

cych operatorów:

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

<< >> && || ++ -- -> ->* , [ ] ( ) new delete =

oraz operatorów postaci

@=

gdzie

@

jest jednym z operatorów:

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

Tomasz Marks - Wydział MiNI PW

-31-

Definiowanie operatorów [2]

(2)

Nie wolno deklarowa

ć

funkcji/metod definiuj

ą

cych

znaczenie operatorów:

:: .* . ?: sizeof typeid

xxxxx_cast

(3)

Operatory

[ ] ( ) -> = @=

musz

ą

by

ć

deklarowane jako metody niestatyczne

(zapewnia to,

ż

e ich pierwszy argument b

ę

dzie

L-warto

ś

ci

ą

)

Tomasz Marks - Wydział MiNI PW

-32-

Definiowanie operatorów [3]

(4)

Operatory:

=

(przypisanie)

&

(utworzenie wskazania)

,

(poł

ą

czenie)

stosowane do obiektów klas maj

ą

swoje pierwotnie

zdefiniowane (predefiniowane) znaczenie.

background image

Tomasz Marks - Wydział MiNI PW

-33-

Definiowanie operatorów [4]

(5)

Funkcja operatorowa musi mie

ć

co najmniej

jeden parametr typu definiowalnego (np. klasy).

(nie dotyczy to operatorów

new

i

delete

).

(5a)

Metody spełniaj

ą

to wymaganie automatycznie.

(5b)

Wynika st

ą

d w szczególno

ś

ci,

ż

e nie mo

ż

na

zmieni

ć

znaczenia operatorów okre

ś

lonych dla

wbudowanych typów danych.

Tomasz Marks - Wydział MiNI PW

-34-

Definiowanie operatorów [5]

(6)

Niezale

ż

nie od utworzonych definicji, formalne

własno

ś

ci operatorów (priorytet, ł

ą

czno

ść

, liczba

argumentów) pozostaj

ą

niezmienione.

(7)

Operatory

++

i

--

mog

ą

wyst

ę

powa

ć

w postaci

przyrostkowej i przedrostkowej.

W celu odró

ż

nienia postaci przyrostkowej

wprowadza si

ę

dla niej umownie drugi parametr

w deklaracji / definicji.

Tomasz Marks - Wydział MiNI PW

-35-

Koniec wykładu 3.


Wyszukiwarka

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

więcej podobnych podstron