Programowanie Obiektowe



Pobieranie 38 Kb.
Data18.06.2018
Rozmiar38 Kb.

Programowanie Obiektowe

WSB-NLU, informatyka rok II


ćwiczenia 8


Konwersje typów definiowane przez użytkownika

W języku C++ można zdefiniować przekształcenie obiektów danej klasy do obiektów innej klasy albo do typu podstawowego. Takie przekształcenie nazywa się konwersją typów definiowana przez użytkownika.


Dwa rodzaje funkcji (obowiązkowo składowych) umożliwiają zdefiniowanie własnej konwersji:

  • Konstruktory jednoargumentowe (dowolny typ argumentu) umożliwiają przekształcenie z typu argumentu do typu klasy: Typ → Klasa,

  • Operatory rzutu wprowadza się definiując w danej klasie operator konwersji z dowolnego typu T (klasa lub typ podstawowy). Jest to zatem funkcja składowa o prototypie: operator T ();

Ćwiczenie 1


Mamy klasę POINT zdefiniowaną następująco:

class POINT

{

float x, y;



public:

POINT(float xx=0.0, float yy=0.0)

{ x = xx; y = yy; }

// ...


};


  1. Dodać do klasy operator rzutu umożliwiający konwersję obiektu typu POINT do liczby float odpowiadającej jego odciętej.

  2. Niech będą dane deklaracje:

POINT p;


float n;

void fun(float);


Co robią instrukcje:
n = p;

fun(p);
Czy są wywoływane w powyższych przypadkach operatory przypisania (klasy POINT) lub konstrukotory kopiujące?

Wsk.

Zdefiniować bezargumentową funkcję składową o nazwie: operator float zwracającą wartość odciętej danego punktu. Przypomnijmy, że typ zwracanej wartości dla operatora konwersji jest podawany po słowie operator.



operator float ()

{

return x;



}

Ćwiczenie 2


Przeanalizować wynik działania następującego programu:
class POINT

{

int x, y;



public:

POINT(int xx=0, int yy=0)

{

x = xx; y = yy;



}

operator int ()

{

cout << ”Envoking int() for a point ”



<< ”(” << x << ”,” << y << ”)” << ”\n”;

return x;

}

};
main()



{

POINT a(2,7), b(3,9);

int n1, n2, n3;
n1 = a + 3; // instrukcja 1

cout << ”n1 = ” << n1 << ”\n”;

n2 = a + b; // instrukcja 2

cout << ”n2 = ” << n2 << ”\n”;


double x1, x2;

x1 = a + 3; // instrukcja 3

cout << „x1 = „ << x1 << „\n”;

x2 = a + b; // instrukcja 4

cout << ”x2 = ” << x2 << ”\n”;

}
Wsk.

Gdy kompilator napotyka w instrukcji 1 wyrażenie a+3, sprawdza najpierw, czy istnieje przeciążony operator dodawania dla typów POINT i int. Tutaj go nie znajduje. Wobec tego szuka konwersji umożliwiających wykonanie zadanej operacji. W tym przypadku wystarczy zastosowanie operatora rzutu ( operator int () ), który przekształci p w int sprowadzając operacje + do dodawania liczb całkowitych.

Ćwiczenie 3


Przeanalizować wynik działania poniższego programu:
class POINT

{

int x, y;



public:

POINT(int xx=0, int yy=0)

{ x = xx; y = yy; }

operator int ()

{

cout << ”Envoking int() for a point ”



<< ”(” << x << ”,” << y < ”)” << ”\n”;

}

};


void fun (double d)

{

cout << ”Envoking fun() with an argument: ” << d << ”\n”;



}
main()

{

POINT a(2,4);



int n;

double x1, x2;


n1 = a + 2.75;

cout << ”n1 = ” << n1 << ”\n”;

x1 = a + 2.75;

cout << ”x1 = ” << x1 << ”\n”;

x2 = a;

cout << ”x2 = ” << x2 << ”\n”;



fun(a);

}

Ćwiczenie 4


Niech będą dane dwie klasy:

class A


{

// ...


public:

friend operator + (A, A);

A (int);

A(B);


};
class B

{

// ...



friend operator + (A, A);

public:


B(int);

// ...


};
Czy w programie zawierającym deklaracje:

A a1, a2, a3;

B b1, b2, b3;

Następujące instrukcje są poprawne, a jeśli tak to co robią?

a1 = b1;

b1 = a1;


a3 = a1 + a2;

a3 = b1 + b2;

b3 = a1 + a2;

Ćwiczenie 5


Zdefiniować klasę STR (string), w której będzie zdefiniowany operator rzutowania (konwersji): STR → int. Jego działanie będzie polegało na zwróceniu długości dane łańcucha zanków.

Zatem ciag instrukcji:

STR s(”Jasiek”);

int k;
k = s;

Spowoduje, że k będzie równe 6.

Wsk.


Przeanalizuj przykład zawarty w pliku Delta\tmp\PO\cw8-5.cpp.
Dziedziczenie (cz. I)

Dziedziczenie (ang. inheritance) to technika pozwalająca na łatwe definiowanie nowej klasy w oparciu o już istniejącą klasę. Najogólniej mówiąc polega to na przejmowaniu właściwości jednej klasy (klasy bazowej) przez inną klasę (klasę pochodną). Przy dziedziczeniu, w skład klasy pochodnej automatycznie wchodzą elementy klasy bazowej, ale możemy oczywiście klasę pochodna rozbudować dodając nowe pole i funkcje składowe.

W języku C++ deklaracja wprowadzająca dziedziczenie wygląda przykładowo tak:
class B : public A

{

// ...



};

Ćwiczenie 6


Mamy w pliku point.h (Delta\tmp\PO\point.h) deklarację klasy POINT o interfejsie:

class POINT

{

float x, y;



public:

void POINT(float=0.0, float=0.0);

void show(void);

float ret_x(void);

float ret_y(void);

};
Utworzyć klasę POINT_EXT, jako pochodną od klasy POINT, która dodatkowo będzie zawierać nową funkcję o nazwie radius, zwracającą promień punktu (odległość od środka układu współrzędnych).


Wsk.

Trzeba dodać funkcje o prototypie:

float radius(void);

Ponieważ składowe x i y są prywatne, pozostają prywatne dla funkcji składowych klasy pochodnej POINT_EXT. Musimy więc przy odwoływaniu się do pól x i y wykorzystać publiczne funkcje klasy POINT ret_x i ret_y.


class POINT_EXT : public POINT

{

public:



float radius(void)

{

return sqrt(ret_x()*ret_x() + ret_y()*ret_y());



}

};

Pobieranie 38 Kb.

Share with your friends:




©operacji.org 2020
wyślij wiadomość

    Strona główna