Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury i funkcji do klasy i metody
Bogdan Kreczmer
bogdan.kreczmer@pwr.wroc.pl
Zakład Podstaw Cybernetyki i Robotyki
Instytut Informatyki, Automatyki i Robotyki
Politechnika Wrocławska
Kurs: Programowanie obiektowe
Copyright c
°2010 Bogdan Kreczmer
Niniejszy dokument zawiera materiały do wykładu dotyczącego programowania obiektowego. Jest on
udostępniony pod warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany
wyłącznie w całości, razem z niniejszą stroną tytułową.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Niniejsza prezentacja została wykonana przy użyciu sys-
temu składu L
A
TEX oraz stylu beamer, którego autorem
jest Till Tantau.
Strona domowa projektu Beamer:
http://latex-beamer.sourceforge.net
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
1
Zapis operacji na strumieniu standardowym
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
2
Definicje metod i przeciążeń operatorów
Metody klasy
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
3
Metody i funkcje rozwijane w linii
Metody rozwijane w linii
Funkcje rozwijane w linii
Podsumowanie
4
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Sekcje definicji klasy
Konstruktor bezparametryczny
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Wyświetlenie prostego komunikatu
Język C
Język C++
#include
<
stdio.h
>
int main( )
{
printf(”Hejka!!!\n”);
return
0;
}
#include
<
iostream
>
int main( )
{
std::cout
<<
”Hejka!!!”
<<
std::endl;
}
Funkcja main w języku C++ domyślnie zwraca wartość 0. Operacje
wyjścia są realizowane na obiekcie cout z wykorzystaniem przeciążenia
operatora lewostronnego przesunięcia bitowego <<
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Wyświetlenie prostego komunikatu
Język C
Język C++
#include
<
stdio.h
>
int main( )
{
printf(”Hejka!!!\n”);
return
0;
}
#include
<
iostream
>
using namespace std;
int main( )
{
std::cout
<<
”Hejka!!!”
<<
std::endl;
}
Użycie dyrektyw using namespace pozwala pominąć przedrostek
przestrzeni nazw std
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Wyświetlenie prostego komunikatu
Język C
Język C++
#include
<
stdio.h
>
int main( )
{
printf(”%6s”, ”Hejka!!!\n”);
return
0;
}
#include
<
iostream
>
using namespace std;
int main( )
{
std::cout
<<
”Hejka!!!”
<<
std::endl;
}
Język C umożliwia formatowanie wyświetlanych danych poprzez
zastosowanie sekwencji formatujących.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Wyświetlenie prostego komunikatu
Język C
Język C++
#include
<
stdio.h
>
int main( )
{
printf(
”%6s”
, ”Hejka!!!\n”);
return
0;
}
#include
<
iostream
>
#include
<
iomanip
>
using namespace std;
int main( )
{
cout
<<
setw(6)
<<
”Hejka!!!”
<<
endl;
}
W języku C++ do formatowania wykorzystujemy manipulatory. Ich użycie
wymaga wcześniejszego dołączenia pliku iomanip.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Formatowanie strumienia wyjściowego
Język C
Język C++
printf(”Napis”);
cout
<<
”Napis”;
printf(”Napis\n”);
cout
<<
”Napis\n”;
cout
<<
”Napis”
<<
endl;
const char
∗wNap = ”Napis”;
const char
∗wNap = ”Napis”;
printf(”%s”, wNap);
cout
<<
wNap;
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Formatowanie strumienia wyjściowego
Język C
Język C++
printf(”Napis”);
cout
<<
”Napis”;
printf(”Napis\n”);
cout
<<
”Napis\n”;
cout
<<
”Napis”
<<
endl;
const char
∗wNap = ”Napis”;
const char
∗wNap = ”Napis”;
printf(”%s”, wNap);
cout
<<
wNap;
printf(”%c”, ’a’);
cout
<<
’a’;
char Znak = ’a’;
char Znak = ’a’;
printf(”%c”, Znak);
cout
<<
Znak;
printf(”\n”);
cout
<<
’\n’;
cout
<<
”\n”;
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przykład użycia poleceń
#include
<
iostream
>
using namespace std;
int main( )
{
const char ∗wNapis = ”Napis”;
cout
<<
wNapis;
cout
<<
’y’;
cout
<<
endl;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Formatowanie strumienia wejściowego
Język C
Język C++
int
ZmInt;
int
ZmInt;
scanf(”%i”, &ZmInt);
cin
>>
ZmInt;
float
ZmFloat;
float
ZmFloat;
scanf(”%f”, &ZmFloat);
cin
>>
ZmFloat;
double
ZmDouble;
double
ZmDouble;
scanf(”%lf”, &ZmDouble);
cin
>>
ZmDouble;
int
ZmInt;
int
ZmInt;
float
ZmFloat;
float
ZmFloat;
scanf(”%i%f”, &ZmInt, &ZmFloat);
cin
>>
ZmInt
>>
ZmFloat;
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przykład użycia poleceń
#include
<
iostream
>
using namespace std;
int main( )
{
int
ZmInt;
float ZmFloat;
cin
>>
ZmInt;
cin
>>
ZmFloat;
cout
<<
ZmInt
<<
endl;
cout
<<
ZmFloat
<<
endl;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Formatowanie strumienia wejściowego
Język C
Język C++
char
Znak;
int
Znak;
scanf(”%c”, &Znak);
cin
>>
Znak;
char
Tab[10000];
char
Tab[10000];
scanf(”%s”, Tab);
cin
>>
Tab;
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Formatowanie strumienia wejściowego
Język C
Język C++
char
Znak;
int
Znak;
scanf(”%c”, &Znak);
cin
>>
Znak;
char
Tab[10000];
char
Tab[10000];
scanf(”%s”, Tab);
cin
>>
Tab;
Tak można, ale mimo to tak nie należy robić !!! (niebezpieczeństwo
niekontrolowanego przepełnienia)
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Formatowanie strumienia wejściowego
Język C
Język C++
char
Tab[10];
char
Tab[10];
scanf(”%10s”, Tab);
cin
>>
setw(sizeof(Tab))
>>
Tab;
char
Znak, Tab[10];
char
Znak, Tab[10];
scanf(”%c%10s”, &Znak, Tab);
cin
>>
Znak
>>
setw(sizeof(Tab))
>>
Tab;
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Formatowanie strumienia wejściowego
Język C
Język C++
Wczytywanie bez pomijania znaków białych
int
KodZnaku;
char
Znak;
scanf(”%c”, &Znak);
cin
>>
noskipws
>>
Znak;
Wymuszenie pomijania znaków białych
char
Znak;
char
Znak;
scanf(” %c”, &Znak);
cin
>>
skipws
>>
Znak;
Odrzucenie znaku
int
KodZnaku;
char
Znak;
KodZnaku = getchar( );
cin.get(Znak);
ungetc(KodZnaku, stdin);
cin.unget( );
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Zestawienie dostępnych strumieni
Język C
Język C++
fprintf(stderr,”Komunikat o błędzie ...”);
cerr
<<
”Komunikat o błędzie ...”;
Predefiniowane strumienie wejścia/wyjścia
FILE∗ stdin
istream
cin
FILE∗ stdout
ostream
cout
FILE∗ stderr
ostream
cerr
ostream
clog
Deklaracje plików nagłówkowych dla operacji wejścia/wyjścia
#include <stdio.h>
#include <iostream>
#include <iomanip>
using namespace std;
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Lewostronna łączność operatora
cout << ”Napis”;
Operacje wejścia/wyjścia są zdefiniowane w oparciu o standardowe
mechanizmy dostępne na poziomie języka C++. W tym sensie biblioteka
standardowa nie wykorzystuje żadnych dodatkowych mechanizmów, które
byłyby spoza definicji jęzka, tak jak to ma miejsce np. w Pascalu.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Lewostronna łączność operatora
cout << ”Napis”;
cout.operator << (”Napis”);
Operacje wejścia/wyjścia są zdefiniowane w oparciu o standardowe
mechanizmy dostępne na poziomie języka C++. W tym sensie biblioteka
standardowa nie wykorzystuje żadnych dodatkowych mechanizmów, które
byłyby spoza definicji jęzka, tak jak to ma miejsce np. w Pascalu.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Lewostronna łączność operatora
cout << ”Napis”;
cout.operator << (”Napis”);
cout << ”Napis” << endl;
Operacje wejścia/wyjścia są zdefiniowane w oparciu o standardowe
mechanizmy dostępne na poziomie języka C++. W tym sensie biblioteka
standardowa nie wykorzystuje żadnych dodatkowych mechanizmów, które
byłyby spoza definicji jęzka, tak jak to ma miejsce np. w Pascalu.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Lewostronna łączność operatora
cout << ”Napis”;
cout.operator << (”Napis”);
cout << ”Napis” << endl;
(cout.operator << (”Napis”) ).operator << (endl);
Operacje wejścia/wyjścia są zdefiniowane w oparciu o standardowe
mechanizmy dostępne na poziomie języka C++. W tym sensie biblioteka
standardowa nie wykorzystuje żadnych dodatkowych mechanizmów, które
byłyby spoza definicji jęzka, tak jak to ma miejsce np. w Pascalu.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Wyświetlanie z wykorzystaniem funkcji
. . .
enum
Element { a, b, c };
void Wyswietl( Element x)
{
const char ∗Nazwa = ”abc”;
cout
<<
Nazwa[x];
}
int main( )
{
Element x = a;
cout
<<
”Wartosc zmiennej x: ”;
Wyswietl( x );
cout
<<
endl;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Wyświetlanie z wykorzystaniem funkcji
. . .
enum
Element { a, b, c };
void Wyswietl( Element x)
{
const char ∗Nazwa = ”abc”;
cout
<<
Nazwa[x];
}
int main( )
{
Element x = a;
cout
<<
”Wartosc zmiennej x: ”;
Wyswietl( x );
cout
<<
endl;
}
Tworzenie specjalizowanej funkcji do
wyświetlania wartości zmiennej danego typu
jest podejściem właściwym dla języka C (gdyż
nie ma tam innej możliwości). Oczywistą wadą
takiego podejścia jest brak elastyczności.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wyjściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm = a;
cout
<<
”Wartosc zmiennej z: ”
<<
Zm
<<
endl;
}
ostream & operator
<<
( ostream & StrmWy, Element x )
{
StrmWy
<<
”abc”[x];
return StrmWy;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wyjściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm = a;
cout
<<
”Wartosc zmiennej z: ”
<<
Zm
<<
endl;
}
ostream & operator << ( ostream & StrmWy, Element x )
{
StrmWy << ”abc”[x];
return StrmWy;
}
Przy definiowaniu przeciążenia muszą być spełnione dwa warunki:
1. Pierwszy parametr musi być klasy ostream i musi on być przekazywany przez referencję.
2. Przeciążenie operatora musi zwracać referencję do pierwszego parametru klasy ostream.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wyjściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm = a;
cout
<<
”Wartosc zmiennej z: ”
<<
Zm
<<
endl;
}
ostream & operator << ( ostream & StrmWy, Element x )
{
return
StrmWy << ”abc”[x]
;
}
Dzięki temu, że przeciążęnie operatora
<<
zwraca zawsze referencję do obiektu ostream,
możliwy jest znacznie bardziej zwarty zapis.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Operacje wyświetlania dla dowolnego typu wyliczeniowego
enum
Stan { Uspienie, Czuwanie, Aktywny };
int main( )
{
Stan
Zm = Czuwanie;
cout
<<
”Wartosc zmiennej z: ”
<<
Zm
<<
endl;
}
ostream & operator << ( ostream & StrmWy, Stan x )
{
const char ∗Nazwa[ ] = { ”Uspienie”, ”Czuwanie”, ”Aktywny” };
return
StrmWy << Nazwa[x];
}
Tłumaczenie wartości stanu na nazwę można łatwo zrealizować wykorzystując tablicę
napisów.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm;
cin
>>
Zm
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm;
cin
>>
Zm
;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
. . .
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm;
cin
>>
Zm
;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Przy definiowaniu przeciążenia muszą być spełnione dwa warunki:
1
Pierwszy parametr musi być klasy istream i musi on być przekazywany
przez referencję.
2
Przeciążenie operatora musi zwracać referencję do pierwszego
parametru klasy istream.
3
Drugi parametr musi być przekazany przez referencję.
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm;
cin
>>
Zm
;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Element TabSymboli[ ] = { a, b, c };
char
ZnakSymbolu;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm;
cin
>>
Zm
;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Element TabSymboli[ ] = { a, b, c };
char
ZnakSymbolu;
StrmWe
>>
ZnakSymbolu;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm;
cin
>>
Zm
;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Element TabSymboli[ ] = { a, b, c };
char
ZnakSymbolu;
StrmWe
>>
ZnakSymbolu;
if (!strchr(“abc”,ZnakSymbolu)) { . . .; exit(1); }
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm;
cin
>>
Zm
;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Element TabSymboli[ ] = { a, b, c };
char
ZnakSymbolu;
StrmWe
>>
ZnakSymbolu;
if (!strchr(“abc”,ZnakSymbolu)) { . . .; exit(1); }
WczytSym = TabSymboli[ZnakSymbolu-’a’];
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm;
cin
>>
Zm
;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Element TabSymboli[ ] = { a, b, c };
char
ZnakSymbolu;
StrmWe
>>
ZnakSymbolu;
if (!strchr(“abc”,ZnakSymbolu)) { . . .; exit(1); }
WczytSym = TabSymboli[ZnakSymbolu-’a’];
return StrmWe;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Zm;
cin
>>
Zm;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Element TabSymboli[ ] = { a, b, c };
char
ZnakSymbolu;
StrmWe
>>
ZnakSymbolu;
if (!strchr(“abc”,ZnakSymbolu)) { . . .; exit(1); }
WczytSym = TabSymboli[ZnakSymbolu-’a’];
return StrmWe;
}
Mają zdefiniowne przeciążenie jak wczytać
zapis operacji z wejścia standardowego:
a+c
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Arg1, Oper, Arg2;
char
Oper;
cin
>>
Arg1
>>
Oper
>>
Arg2
;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Element TabSymboli[ ] = { a, b, c };
char
ZnakSymbolu;
. . .
}
a+c
Operacja staje się bardzo prosta. Wczytujemy pierwszy
argument jako symbol, znak operatora, a następnie
drugi argument także jako symbol.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Arg1, Oper, Arg2;
char
Oper;
cin
>>
Arg1
>>
Oper
>>
Arg2;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Element TabSymboli[ ] = { a, b, c };
char
ZnakSymbolu;
. . .
}
A jak przeczytać napis:
”a+c”
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Arg1, Oper, Arg2;
char
Oper;
istringstream
StrmNap;
StrmNap.str(”a+b”);
StrmNap
>>
Arg1
>>
Oper
>>
Arg2
;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Element TabSymboli[ ] = { a, b, c };
char
ZnakSymbolu;
. . .
}
Można do tego celu wykorzystać strumień napisowy.
Nasze przeciążenie będzie działało również w tym
przypadku, gdyż klasa istringstream dziedziczy klasę
istream.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Podstawowe operacje
Formatowanie strumieni standardowych - porównanie C i C++
Wejście standardowe i strumień wejściowy
Strumienie standardowe, przeciążanie operacji na strumieniach
Przeciążenie operacji dla strumienia wejściowego
enum
Element { a, b, c };
int main( )
{
Element
Arg1, Oper, Arg2;
char
Oper;
istringstream
StrmNap;
StrmNap.str(”a+b”);
StrmNap
>>
Arg1
>>
Oper
>>
Arg2
;
}
istream & operator
>>
( istream & StrmWe, Element & WczytSym )
{
Element TabSymboli[ ] = { a, b, c };
char
ZnakSymbolu;
. . .
}
Aby wszystko zadziałało trzeba pamiętać aby wcześniej
dołączyć plik nagłówkowy sstream, tzn.
#include<sstream>
W nim znajduje się definicja klasy istringstream.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do metody
Jeszcze funkcja
Już metoda
struct LZespolona {
float re;
float im;
};
void sprzezenie( LZespolona ∗wLZesp )
{
wLZesp–
>
im = – wLZesp–
>
im;
}
int main( )
{
LZespolona
LZesp;
LZesp.re = 5;
LZesp.im = -6;
sprzezenie(&LZesp);
}
struct LZespolona {
float re;
float im;
void Sprzezenie( );
};
void LZespolona::Sprzezenie( )
{
im = – im;
}
int main( )
{
LZespolona
LZesp;
LZesp.re = 5;
LZesp.im = -6;
LZesp.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Model obiektu
Struktura i funkcja
Struktura i metoda
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Funkcja działająca na strukturze
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona dodaj( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = dodaj( lz1, lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Funkcja działająca na strukturze
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona dodaj( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = dodaj( lz1, lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Funkcja działająca na strukturze
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona dodaj( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = dodaj( lz1, lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do metody
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona dodaj( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = dodaj( lz1, lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do metody
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona dodaj( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona dodaj( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = dodaj( lz1, lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do metody
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona dodaj( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona dodaj( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = dodaj( lz1, lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do metody
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona dodaj( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::dodaj( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = dodaj( lz1, lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do metody
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona dodaj( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::dodaj( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
dodaj( lz1, lz2 )
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do metody
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona dodaj( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::dodaj( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
lz1.dodaj( lz2 )
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do metody
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona dodaj( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::dodaj( LZespolona
Z2 )
{
Z2.re +=
this –>
re;
Z2.im +=
this –>
im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1.dodaj( lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od metody do funkcji w C
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::dodaj( LZespolona
Z2 )
{
Z2.re += this –>re;
Z2.im += this –>im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1.dodaj( lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od metody do funkcji w C
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona dodaj( LZespolona
*
this
, LZespolona
Z2 )
{
Z2.re +=
this–>
re;
Z2.im +=
this–>
im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1.dodaj( lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od metody do funkcji w C
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona dodaj( LZespolona
*this, LZespolona
Z2 )
{
Z2.re += this–>re;
Z2.im += this–>im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
dodaj( &lz1, lz2 )
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Ten sam zapis w C++
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona dodaj( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::dodaj( LZespolona
Z2 )
{
Z2.re += this –>re;
Z2.im += this –>im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1.dodaj( lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Ten sam zapis w C++
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona dodaj( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::dodaj( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1.dodaj( lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona dodaj( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = dodaj( lz1, lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona dodaj( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = dodaj( lz1, lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator + ( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = dodaj( lz1, lz2 );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator + ( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
dodaj( lz1, lz2 )
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator + ( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
lz1 + lz2
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator + ( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
lz1 + lz2 + lz1
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator + ( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
lz1 + lz2 + lz1+ (lz1 = l2 + lz1)
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator + ( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1 + lz2;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator + ( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator + ( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1 + lz2;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator + ( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator + ( LZespolona
Z1, LZespolona
Z2 )
{
Z2.re += Z1.re;
Z2.im += Z1.im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1 + lz2;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator + ( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1 + lz2;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator + ( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
lz1 + lz2
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator + ( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::operator + ( LZespolona
Z2 )
{
re += Z2.re;
im += Z2.im;
return
∗this ;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1 + lz2;
}
A czy tak będzie dobrze?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Od funkcji do operatora
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator + ( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::operator + ( LZespolona
Z2 )
{
re += Z2.re;
im += Z2.im;
return
∗this ;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1 + lz2;
}
Nie jest to poprawna implementacja, gdyż
przy okazji obliczenia sumy zmieniana jest
zawartość obiektu i jest ona widoczna “na
zewnątrz”.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Operatory dla różnych argumentów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator + ( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::operator ∗ ( float
liczba )
{
LZespolona
Z;
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1 ∗ 3;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Operatory dla różnych argumentów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator ∗ ( float
liczba );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::operator ∗ ( float
liczba )
{
LZespolona
Z;
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 = lz1 ∗ 3;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Operatory dla różnych argumentów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator ∗ ( float
liczba );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::operator ∗ ( float
liczba )
{
LZespolona
Z;
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
lz1 ∗ 3
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Operatory dla różnych argumentów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator ∗ ( float
liczba );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::operator ∗ ( float
liczba )
{
LZespolona
Z;
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
lz1 ∗ 3
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Operatory dla różnych argumentów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator ∗ ( float
liczba );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::operator ∗ ( float
liczba )
{
LZespolona
Z;
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
3 ∗ lz1
;
}
Czy ta operacja lz2 = 3 ∗ lz1
jest poprawna?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Operatory dla różnych argumentów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator ∗ ( LZespolona Z, float
liczba )
{
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
3 ∗ lz1
;
}
Czy ta operacja lz3 = 3 ∗ lz1
jest poprawna?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Operatory dla różnych argumentów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator ∗ ( LZespolona Z, float
liczba )
{
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
operator ∗ ( 3, lz1 )
;
}
Czy ta operacja lz3 = 3 ∗ lz1
jest poprawna?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Operatory dla różnych argumentów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona
operator ∗
(
LZespolona Z
,
float
liczba
)
{
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
operator ∗ ( 3, lz1 )
;
}
Operacja nie jest poprawna, gdyż
brak jest zgodności typów
poszczególnych argumentów.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przemienność operatorów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona
operator ∗
(
float
liczba
,
LZespolona Z
)
{
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
operator ∗ ( 3, lz1 )
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przemienność operatorów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona
operator ∗
(
float
liczba
,
LZespolona Z
)
{
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
3 ∗ lz1
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przemienność operatorów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona
operator ∗
(
float
liczba
,
LZespolona Z
)
{
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
3 ∗ lz1 ∗ 5
;
}
A czy teraz wszystko będzie dobrze?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przemienność operatorów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona
operator ∗
(
float
liczba
,
LZespolona Z
)
{
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
3 ∗ lz1 ∗ 5
;
}
Aby wszystko było dobrze należy zapewnić
przemienność operacji mnożenia.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przemienność operatorów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator ∗ ( float
liczba );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona
operator ∗
(
float
liczba
,
LZespolona Z
)
{
Z.re = re ∗ liczba;
Z.im = im ∗ liczba;
return
Z;
}
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
3 ∗ lz1 ∗ 5
;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przemienność operatorów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
LZespolona operator ∗ ( float
liczba );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::operator ∗ ( float
liczba )
{ . . . }
LZespolona operator ∗ ( float
liczba, LZespolona Z )
{ . . . }
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
3 ∗ lz1 ∗ 5
;
}
Teraz jest już dobrze.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przemienność operatorów
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona operator ∗ ( LZespolona
Z, float
liczba )
{ . . . }
LZespolona operator ∗ ( float
liczba, LZespolona Z )
{ . . . }
int main( )
{
LZespolona
lz1, lz2, lz3;
lz3 =
3 ∗ lz1 ∗ 5
;
}
Teraz jest również dobrze.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody klasy
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przeciążanie na zewnątrz klasy
Kiedy należy definiować przeciążenie operatora zewnętrznie względem
danej klasy?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody klasy
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przeciążanie na zewnątrz klasy
Kiedy należy definiować przeciążenie operatora zewnętrznie względem
danej klasy?
Gdy pierwszym argumentem jest jeden z wbudowanych
typów prostych, np. int, char, char*, itd.
Gdy pierwszym argumentem jest klasa, której definicja
nie może być zmodyfikowana, np. std::ostream,
std::istream itd.
Gdy przeciążenie ma mieć charakter lokalny, np. ma być
widoczne tylko w danym module. To znaczy, gdy nie
chcemy, aby przeciążenie to było trwałą własnością klasy.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody klasy
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przeciążanie na zewnątrz klasy
Kiedy należy definiować przeciążenie operatora zewnętrznie względem
danej klasy?
Gdy pierwszym argumentem jest jeden z wbudowanych
typów prostych, np. int, char, char*, itd.
Gdy pierwszym argumentem jest klasa, której definicja
nie może być zmodyfikowana, np. std::ostream,
std::istream itd.
Gdy przeciążenie ma mieć charakter lokalny, np. ma być
widoczne tylko w danym module. To znaczy, gdy nie
chcemy, aby przeciążenie to było trwałą własnością klasy.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody klasy
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przeciążanie na zewnątrz klasy
Kiedy należy definiować przeciążenie operatora zewnętrznie względem
danej klasy?
Gdy pierwszym argumentem jest jeden z wbudowanych
typów prostych, np. int, char, char*, itd.
Gdy pierwszym argumentem jest klasa, której definicja
nie może być zmodyfikowana, np. std::ostream,
std::istream itd.
Gdy przeciążenie ma mieć charakter lokalny, np. ma być
widoczne tylko w danym module. To znaczy, gdy nie
chcemy, aby przeciążenie to było trwałą własnością klasy.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody klasy
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przeciążanie na zewnątrz klasy
Kiedy należy definiować przeciążenie operatora zewnętrznie względem
danej klasy?
Gdy pierwszym argumentem jest jeden z wbudowanych
typów prostych, np. int, char, char*, itd.
Gdy pierwszym argumentem jest klasa, której definicja
nie może być zmodyfikowana, np. std::ostream,
std::istream itd.
Gdy przeciążenie ma mieć charakter lokalny, np. ma być
widoczne tylko w danym module. To znaczy, gdy nie
chcemy, aby przeciążenie to było trwałą własnością klasy.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody klasy
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przeciążanie wewnątrz klasy
Kiedy należy definiować przeciążenie operatora jako metodę klasy?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody klasy
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przeciążanie wewnątrz klasy
Kiedy należy definiować przeciążenie operatora jako metodę klasy?
Gdy przeciążenie ma należeć do trwałych własności klasy.
Zdefiniowanie przeciążenia w klasie poprawia czytelność
dokumentacji kodu, jak też samego kodu.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody klasy
Przeciążanie operatorów
Przeciążąnie operatorów w klasie i na zewnątrz niej
Przeciążanie wewnątrz klasy
Kiedy należy definiować przeciążenie operatora jako metodę klasy?
Gdy przeciążenie ma należeć do trwałych własności klasy.
Zdefiniowanie przeciążenia w klasie poprawia czytelność
dokumentacji kodu, jak też samego kodu.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metody na zewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::Sprzezenie( )
{
im = –im;
}
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metody na zewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::Sprzezenie( )
{
im = –im;
}
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metody na zewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::Sprzezenie( )
{
im = –im;
}
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metody na zewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::Sprzezenie( )
{
im = –im;
}
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metody na zewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LZespolona LZespolona::Sprzezenie( )
{
im = –im;
}
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( )
{
im = –im;
}
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( ) { im = –im; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
void Sprzezenie( ) { im = –im; }
LZespolona operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
void Sprzezenie( ) { im = –im; }
LZespolona operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
float re;
float im;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
W ciele definicji klasy kolejność deklaracji
pól i definicji metod nie ma znaczenia.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Kod metody definiowanej w ciele klasy
domyślnie rozwijany jest przez kompilator w
miejscu wywołania metody.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Domyślne zachowanie kompilatora może
zostać jednak zmienione poprzez użycie
odpowiednich opcji, np. dla g++ jest to
-fno-default-inline.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
inline void Sprzezenie( ) { im = –im; }
inline LZespolona operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Chcąc uniezależnić się od ustawień
kompilatora można użyć słowa kluczowe
inline.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod wewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
inline void Sprzezenie( ) { im = –im; }
inline LZespolona operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Użycie inline nie gwarantuje rozwinięcia
kodu. Jest ono traktowane jedynie jako
zalecenie. Kompilator sam podejmuje
decyzję, czy kod można rozwinąć.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje rozwijane w linii
Podsumowanie
Definiowanie metod inline na zewnątrz definicji klasy
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
inline void Sprzezenie( ) { im = –im; }
inline LZespolona operator + ( LZespolona
Z2 );
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
inline LZespolona LZespolona::operator + ( LZespolona
Z2 )
{
Z2.re += re;
Z2.im += im;
return
Z2;
}
int main( )
{
LZespolona
lz1;
lz1.Sprzezenie( );
}
Metody typu inline mogą być definiowane
również poza ciałem klasy. Jednak wtedy
koniecznie należy użyć modyfikatora
inline.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje typu inline
inline double Poteguj( double Wykladnik, unsigned int Potega )
{
double Wynik = 1;
for
(; Potega; −−Potega) Wynik ∗= Wykladnik;
return Wynik;
}
int main( )
{
double Wynik =
Poteguj(4,3)
;
cout
<<
Wynik
<<
endl;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje typu inline
inline double Poteguj( double Wykladnik, unsigned int Potega )
{
return Potega == 0 ? 1 : Wykladnik∗Poteguj(Wykladnik,Potega – 1);
}
int main( )
{
double Wynik =
Poteguj(4,3)
;
cout
<<
Wynik
<<
endl;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje typu inline
inline double Poteguj( double Wykladnik, unsigned int Potega )
{
return Potega == 0 ? 1 : Wykladnik∗Poteguj(Wykladnik,Potega – 1);
}
int main( )
{
double Wynik =
Poteguj(4,3)
;
cout
<<
Wynik
<<
endl;
}
Sposób rozwinięcia kodu zależy od inteligencji kompilatora. Dla
przedstawionego wywołania może ono mieć postać 4∗Poteguj(4,2),
albo też może ono sprowadzić się do zapisu 64.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje typu inline
inline double Poteguj( double Wykladnik, unsigned int Potega )
{
return Potega == 0 ? 1 : Wykladnik∗Poteguj(Wykladnik,Potega – 1);
}
int main( )
{
double Wynik =
Poteguj(4,3)
;
cout
<<
Wynik
<<
endl;
}
modul.cpp
program.cpp
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje typu inline
inline double Poteguj( double Wykladnik, unsigned int Potega )
{
return Potega == 0 ? 1 : Wykladnik∗Poteguj(Wykladnik,Potega – 1);
}
int main( )
{
double Wynik =
Poteguj(4,3)
;
cout
<<
Wynik
<<
endl;
}
modul.cpp
program.cpp
inline double Poteguj( double Wykladnik, unsigned int Potega );
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje typu inline
inline double Poteguj( double Wykladnik, unsigned int Potega )
{
return Potega == 0 ? 1 : Wykladnik∗Poteguj(Wykladnik,Potega – 1);
}
int main( )
{
double Wynik =
Poteguj(4,3)
;
cout
<<
Wynik
<<
endl;
}
modul.cpp
program.cpp
inline double Poteguj( double Wykladnik, unsigned int Potega );
Odwołanie do funkcji rozwijanej w linii może być zrealizowane tylko i
wyłącznie w tej samej jednostce translacyjnej, w której jest ona zdefiniowana.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje typu inline
inline double Poteguj( double Wykladnik, unsigned int Potega )
{
return Potega == 0 ? 1 : Wykladnik∗Poteguj(Wykladnik,Potega – 1);
}
int main( )
{
double Wynik =
Poteguj(4,3)
;
cout
<<
Wynik
<<
endl;
}
modul.cpp
program.cpp
inline double Poteguj( double Wykladnik, unsigned int Potega );
Konsolidacja tego kodu zakończy się niepowodzeniem. Linker zgłosi brak kodu
funkcji Poteguj.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje typu inline
inline double Poteguj( double Wykladnik, unsigned int Potega )
{
return Potega == 0 ? 1 : Wykladnik∗Poteguj(Wykladnik,Potega – 1);
}
int main( )
{
double Wynik =
Poteguj(4,3)
;
cout
<<
Wynik
<<
endl;
}
modul.hh
program.cpp
#include ”modul.hh”
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Funkcje typu inline
inline double Poteguj( double Wykladnik, unsigned int Potega )
{
return Potega == 0 ? 1 : Wykladnik∗Poteguj(Wykladnik,Potega – 1);
}
int main( )
{
double Wynik =
Poteguj(4,3)
;
cout
<<
Wynik
<<
endl;
}
modul.hh
program.cpp
#include ”modul.hh”
Funkcje rozwijane w linii, które są eksportowane do innych modułów muszą
być definiowane w plikach nagłówkowych.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody rozwijane w linii
Funkcje rozwijane w linii
Uwarunkowania rozwinięć kodu
Specyfikator inline nie jest dla kompilatora poleceniem
rozwinięcia funkcji lub metody w linii wywołania. Pełni on
jedynie rolę zalecenia, które powinno być w miarę
możliwości uwzględnione.
Kompilator przy podejmowaniu decyzji o rozwinięciu kodu
funkcji kierować się może heurystycznymi ocenami
uzwględniającymi, np. rozmiar kodu rozwijanej funkcji i/lub
ilość dokonanych rozwinięć w aktualnie kompilowanej
funkcji.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody rozwijane w linii
Funkcje rozwijane w linii
Uwarunkowania rozwinięć kodu
Specyfikator inline nie jest dla kompilatora poleceniem
rozwinięcia funkcji lub metody w linii wywołania. Pełni on
jedynie rolę zalecenia, które powinno być w miarę
możliwości uwzględnione.
Kompilator przy podejmowaniu decyzji o rozwinięciu kodu
funkcji kierować się może heurystycznymi ocenami
uzwględniającymi, np. rozmiar kodu rozwijanej funkcji i/lub
ilość dokonanych rozwinięć w aktualnie kompilowanej
funkcji.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody rozwijane w linii
Funkcje rozwijane w linii
Uwarunkowania rozwinięć kodu
Specyfikator inline nie jest dla kompilatora poleceniem
rozwinięcia funkcji lub metody w linii wywołania. Pełni on
jedynie rolę zalecenia, które powinno być w miarę
możliwości uwzględnione.
Kompilator przy podejmowaniu decyzji o rozwinięciu kodu
funkcji kierować się może heurystycznymi ocenami
uzwględniającymi, np. rozmiar kodu rozwijanej funkcji i/lub
ilość dokonanych rozwinięć w aktualnie kompilowanej
funkcji.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody rozwijane w linii
Funkcje rozwijane w linii
Konsekwencje rozwinięcia kodu
Rozwinięcie funkcji nie zawsze musi oznaczać zwiększenie
rozmiaru kodu (aczkolwiek zazwyczaj tak jest).
Stosowanie częstych rozwinięć funkcji nie zawsze musi
oznaczać przyśpieszenie wykonywania kodu (aczkolwiek
zazwyczaj tak jest).
Specyfikator inline nie wpływa na znaczenie funkcji;
funkcja rozwijana w miejscu wywołania nadal ma
unikatowy adres.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody rozwijane w linii
Funkcje rozwijane w linii
Konsekwencje rozwinięcia kodu
Rozwinięcie funkcji nie zawsze musi oznaczać zwiększenie
rozmiaru kodu (aczkolwiek zazwyczaj tak jest).
Stosowanie częstych rozwinięć funkcji nie zawsze musi
oznaczać przyśpieszenie wykonywania kodu (aczkolwiek
zazwyczaj tak jest).
Specyfikator inline nie wpływa na znaczenie funkcji;
funkcja rozwijana w miejscu wywołania nadal ma
unikatowy adres.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody rozwijane w linii
Funkcje rozwijane w linii
Konsekwencje rozwinięcia kodu
Rozwinięcie funkcji nie zawsze musi oznaczać zwiększenie
rozmiaru kodu (aczkolwiek zazwyczaj tak jest).
Stosowanie częstych rozwinięć funkcji nie zawsze musi
oznaczać przyśpieszenie wykonywania kodu (aczkolwiek
zazwyczaj tak jest).
Specyfikator inline nie wpływa na znaczenie funkcji;
funkcja rozwijana w miejscu wywołania nadal ma
unikatowy adres.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Metody rozwijane w linii
Funkcje rozwijane w linii
Konsekwencje rozwinięcia kodu
Rozwinięcie funkcji nie zawsze musi oznaczać zwiększenie
rozmiaru kodu (aczkolwiek zazwyczaj tak jest).
Stosowanie częstych rozwinięć funkcji nie zawsze musi
oznaczać przyśpieszenie wykonywania kodu (aczkolwiek
zazwyczaj tak jest).
Specyfikator inline nie wpływa na znaczenie funkcji;
funkcja rozwijana w miejscu wywołania nadal ma
unikatowy adres.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Reprezentacja w języku UML
Sekcje definicji klasy
Konstruktor bezparametryczny
Równoważność definicji struct i class
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + (LZespolona Z2);
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Reprezentacja w języku UML
Sekcje definicji klasy
Konstruktor bezparametryczny
Równoważność definicji struct i class
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + (LZespolona Z2);
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
class LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public:
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + (LZespolona Z2);
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Reprezentacja w języku UML
Sekcje definicji klasy
Konstruktor bezparametryczny
Równoważność definicji struct i class
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . .
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
class LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public:
. . .
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Reprezentacja w języku UML
Sekcje definicji klasy
Konstruktor bezparametryczny
Równoważność definicji struct i class
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . .
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
class LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public:
. . .
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Sekcje definicji klasy
Konstruktor bezparametryczny
Reprezentacja graficzna
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + (LZespolona Z2);
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
class LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public:
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + (LZespolona Z2);
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Sekcje definicji klasy
Konstruktor bezparametryczny
Reprezentacja graficzna
struct LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . .
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + (LZespolona Z2);
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
class LZespolona
{ // . . . . . . . . . . . . . . . . . . . . . . .
public:
float re;
float im;
void Sprzezenie( ) { im = –im; }
LZespolona operator + (LZespolona Z2);
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Sekcje definicji klasy
Konstruktor bezparametryczny
Klasy złożone
class Prostokat { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x Rog GornyLewy;
float y Rog GornyLewy;
float x Rog DolnyPrawy;
float y Rog DolnyPrawy;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Sekcje definicji klasy
Konstruktor bezparametryczny
Klasy złożone
class Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x;
float y;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
class Prostokat { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x Rog GornyLewy;
float y Rog GornyLewy;
float x Rog DolnyPrawy;
float y Rog DolnyPrawy;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Sekcje definicji klasy
Konstruktor bezparametryczny
Klasy złożone
class Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x;
float y;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
class Prostokat { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x Rog GornyLewy;
float y Rog GornyLewy;
float x Rog DolnyPrawy;
float y Rog DolnyPrawy;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Sekcje definicji klasy
Konstruktor bezparametryczny
Klasy złożone
class Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x;
float y;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
class Prostokat { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x Rog GornyLewy;
float y Rog GornyLewy;
float x Rog DolnyPrawy;
float y Rog DolnyPrawy;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Sekcje definicji klasy
Konstruktor bezparametryczny
Klasy złożone
class Wektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x;
float y;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
class Prostokat { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
Wektor Rog GornyLewy;
Wektor Rog DolnyPrawy;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Sekcje definicji klasy
Konstruktor bezparametryczny
Klasy złożone
class Wektor { // . . . . . . . . . . . . . . .
public :
float x;
float y;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
class Prostokat { // . . . . . . . . . . . . .
public :
Wektor Rog GornyLewy;
Wektor Rog DolnyPrawy;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk. Wynik
<<
endl;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk. Wynik
<<
endl;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk. Wynik
<<
endl;
}
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk. Wynik
<<
endl;
}
Jeżeli nie zostanie wywołana więcej razy
metoda Mnoz, to jaka zawartość pola
Wynik zostanie wyświetlona za pomocą
ostatniej instrukcji?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk. Wynik
<<
endl;
}
Tego nikt nie wie ... :(
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
Kalk. Wynik = 5;
. . .
cout
<<
Kalk. Wynik
<<
endl;
}
Do pola Wynik można dostać się w
dowolnym miejscu programu i zmienić
jego zawartość niezależnie od wywołania
metody Mnoz.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
private:
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
Kalk. Wynik = 5;
. . .
cout
<<
Kalk. Wynik
<<
endl;
}
A czy teraz coś się zmieni?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
private:
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
Kalk. Wynik = 5;
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
((
((
((
((
(
((
((
((
((
(
((
((
((
((
(
((
((
((
((
(
. . .
cout
<<
Kalk. Wynik
<<
endl;
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
((
((
((
((
(
((
((
((
((
(
((
((
((
((
(
((
((
((
((
(
}
TAK !!! Dostęp do pola Wynik poza
metodami klasy Kalkulator nie będzie
możliwy.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
private:
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
Kalk. Wynik = 5;
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
((
((
((
((
(
((
((
((
((
(
((
((
((
((
(
((
((
((
((
(
. . .
cout
<<
Kalk. Wynik
<<
endl;
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
((
((
((
((
(
((
((
((
((
(
((
((
((
((
(
((
((
((
((
(
}
Jak w takim razie odczytać wartość pola
Wynik?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float WezWynik( ) { return Wynik; }
private:
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
Kalk. Wynik = 5;
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
hhh
((
((
((
((
(
((
((
((
((
(
((
((
((
((
(
((
((
((
((
(
. . .
cout
<<
Kalk.WezWynik( )
<<
endl;
}
Można to zrobić tworząc metodę
udostępniającą wartość tego pola, która
będzie zdefiniowana w części publicznej.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Dostęp do komponentów klasy
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float WezWynik( ) { return Wynik; }
private:
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk.WezWynik( )
<<
endl;
}
Jeżeli nie zostanie wywołana więcej razy
metoda Mnoz, to jaka zawartość pola
Wynik zostanie wyświetlona za pomocą
ostatniej instrukcji?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Sekcje definicji klasy
Inicjalizacja komponentów
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float WezWynik( ) { return Wynik; }
private:
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk.WezWynik( )
<<
endl;
}
Jak jednak zainicjalizować pole Wynik?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Sekcje definicji klasy
Inicjalizacja komponentów
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Kalkulator( ){ Wynik = Pamiec = 0; }
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float WezWynik( ) { return Wynik; }
private:
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk.WezWynik( )
<<
endl;
}
Do tego celu możemy wykorzystać
specjalny rodzaj metody zwanej
konstruktorem.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Sekcje definicji klasy
Inicjalizacja komponentów
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Kalkulator( ){ Wynik = Pamiec = 0; }
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float WezWynik( ) { return Wynik; }
private:
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk;
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk.WezWynik( )
<<
endl;
}
Konstruktor jest wywoływany niejawnie
w momencie utworzenia obiektu.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Sekcje definicji klasy
Inicjalizacja komponentów
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Kalkulator( ){ Wynik = Pamiec = 0; }
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float WezWynik( ) { return Wynik; }
private:
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk( );
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk.WezWynik( )
<<
endl;
}
Konstruktor można wywołać w sposób
jawny.
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
Od struktury do klasy
Reprezentacja w języku UML
Sekcje definicji klasy
Inicjalizacja komponentów
struct Kalkulator
{ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
float Mnoz(float Arg1, float Arg2) { return
Wynik = Arg1 ∗ Arg2; }
float WezWynik( ) { return Wynik; }
private:
float
Wynik;
float
Pamiec;
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Kalkulator
Kalk( );
Kalk.Mnoz( 7, 9 );
. . .
. . .
. . .
cout
<<
Kalk.WezWynik( )
<<
endl;
}
A czy tak będzie dobrze?
Programowanie obiektowe
Zapis operacji na strumieniu standardowym
Definicje metod i przeciążeń operatorów
Metody i funkcje rozwijane w linii
Definicje struktur złożonych, zależności
To już koniec :(.
Programowanie obiektowe