08 zakres prez


Zakres ważności, przekazywanie obiektów, obiekty
tymczasowe
Bogdan Kreczmer
ZPCiR IIAiR PWr
pokój 307 budynek C3
bogdan.kreczmer@pwr.wroc.pl
Copyright ©2005 2010 Bogdan Kreczmer

Niniejszy dokument zawiera materiały do wykładu na temat 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ą.
1
Zakres ważności deklaracji
class PrzykladKlasy { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PrzykladKlasy ObA( A );
int main( )
{
cout <<  main: 1 << endl;
PrzykladKlasy ObB( B );
cout <<  main: 2 << endl;
{
PrzykladKlasy ObC( C );
}
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
1
Zakres ważności deklaracji
class PrzykladKlasy { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PrzykladKlasy ObA( A );
int main( )
Wynik działania:
{
++ Konstruktor obiektu: A
cout <<  main: 1 << endl;
main: 1
PrzykladKlasy ObB( B );
++ Konstruktor obiektu: B
cout <<  main: 2 << endl;
main: 2
{
++ Konstruktor obiektu: C
-- Destruktor obiektu: C
PrzykladKlasy ObC( C );
main: 3
}
-- Destruktor obiektu: B
cout <<  main: 3 << endl;
-- Destruktor obiektu: A
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
1
Zakres ważności deklaracji
class PrzykladKlasy { //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PrzykladKlasy ObA( A );
int main( )
Wynik działania:
{
++ Konstruktor obiektu: A
cout <<  main: 1 << endl;
main: 1
PrzykladKlasy ObB( B );
++ Konstruktor obiektu: B
cout <<  main: 2 << endl;
main: 2
{
++ Konstruktor obiektu: C
-- Destruktor obiektu: C
PrzykladKlasy ObC( C );
main: 3
}
-- Destruktor obiektu: B
cout <<  main: 3 << endl;
-- Destruktor obiektu: A
}
Utworzenie bloku instrukcji wyznacza czas życia tworzonych statycznie obiektów.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
2
Obszar istnienia zmiennych dynamicznych
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
PrzykladKlasy "wOb1;
{
PrzykladKlasy "wOb2 = new PrzykladKlasy( X );
wOb1 = wOb2;
}
cout <<  main: 2 << endl;
delete wOb1;
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
2
Obszar istnienia zmiennych dynamicznych
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
PrzykladKlasy "wOb1;
{
PrzykladKlasy "wOb2 = new PrzykladKlasy( X );
wOb1 = wOb2;
Wynik działania:
}
main: 1
cout <<  main: 2 << endl; ++ Konstruktor obiektu: X
main: 2
delete wOb1;
-- Destruktor obiektu: X
cout <<  main: 3 << endl;
main: 3
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
2
Obszar istnienia zmiennych dynamicznych
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
PrzykladKlasy "wOb1;
{
PrzykladKlasy "wOb2 = new PrzykladKlasy( X );
wOb1 = wOb2;
Wynik działania:
}
main: 1
cout <<  main: 2 << endl; ++ Konstruktor obiektu: X
main: 2
delete wOb1;
-- Destruktor obiektu: X
cout <<  main: 3 << endl;
main: 3
}
Zmienne tworzone dynamicznie istnieją niezależnie od zakresu ważności deklaracji zmiennej wskaz-
nikowej. Ich destruktory uruchamiane są tylko i wyłącznie w momencie użycia operatora delete.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
3
Definiowanie zmiennych w  locie
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
int Zm = 0;
cout <<  main: 1 << endl;
if (Zm == 0) { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaTest ObA( A );
} else { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaTest ObB( B );
} // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
cout <<  main: 2 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
3
Definiowanie zmiennych w  locie
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
int Zm = 0;
cout <<  main: 1 << endl;
if (Zm == 0) { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaTest ObA( A );
} else { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
KlasaTest ObB( B );
main: 1
} // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
++ Konstruktor obiektu: A
cout <<  main: 2 << endl; - Destruktor obiektu: A
}
main: 2
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
3
Definiowanie zmiennych w  locie
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
int Zm = 0;
cout <<  main: 1 << endl;
if (Zm == 0) { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
KlasaTest ObA( A );
} else { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
KlasaTest ObB( B );
main: 1
} // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
++ Konstruktor obiektu: A
cout <<  main: 2 << endl; - Destruktor obiektu: A
}
main: 2
Mechanizmy definiowania zmiennych w języku C++ pozwalają je tworzyć w tych miejscach, w któ-
rych faktycznie sÄ… potrzebne.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
4
Definiowanie zmiennych w  locie
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
for ( int licznik = 0; licznik<2; ++licznik ) { // . . . . . . . . .
KlasaTest ObA( A );
cout <<  Licznik:  << licznik << endl;
} // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
cout <<  main: 2 << endl;




cout <<  Licznik:  << < endl;
licznik <


}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
4
Definiowanie zmiennych w  locie
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl; Wynik działania:
main: 1
for ( int licznik = 0; licznik<2; ++licznik ) { // . . . . . . . . .
++ Konstruktor obiektu: A
KlasaTest ObA( A );
Licznik: 0
cout <<  Licznik:  << licznik << endl;
- Destruktor obiektu: A
} // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
++ Konstruktor obiektu: A
cout <<  main: 2 << endl;
Licznik: 1




- Destruktor obiektu: A
cout <<  Licznik:  << < endl;
licznik <


}
main: 2
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
4
Definiowanie zmiennych w  locie
class PrzykladKlasy { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
PrzykladKlasy( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
PrzykladKlasy( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl; Wynik działania:
main: 1
for ( int licznik = 0; licznik<2; ++licznik ) { // . . . . . . . . .
++ Konstruktor obiektu: A
KlasaTest ObA( A );
Licznik: 0
cout <<  Licznik:  << licznik << endl;
- Destruktor obiektu: A
} // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
++ Konstruktor obiektu: A
cout <<  main: 2 << endl;
Licznik: 1




- Destruktor obiektu: A
cout <<  Licznik:  << < endl;
licznik <


}
main: 2
W instrukcji for można definiować i inicjalizować zmienne pełniące rolę liczników lub w inny sposób
wykorzystywane w trakcie iteracji pętli. Pozwala to utworzyć zmienną dopiero w tym miejscu, w
którym jest potrzebna. Deklarowanie zmiennych i obiektów wewnątrz bloku instrukcji for wiąże się z
ich kreowaniem i destrukcją przy każdej iteracji pętli.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
5
Definiowanie zmiennych w  locie
if ( int Zm = Funkcja( ) ) {
// Zakres widoczności zmiennej Zm
} else {
// Zakres widoczności zmiennej Zm
}
switch ( int Zm = Funkcja( ) ) {
// Zakres widoczności zmiennej Zm
}
while ( int Zm = Funkcja( ) ) {
// Zakres widoczności zmiennej Zm
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
5
Definiowanie zmiennych w  locie
if ( int Zm = Funkcja( ) ) {
// Zakres widoczności zmiennej Zm
} else {
// Zakres widoczności zmiennej Zm
}
switch ( int Zm = Funkcja( ) ) {
// Zakres widoczności zmiennej Zm
}
while ( int Zm = Funkcja( ) ) {
// Zakres widoczności zmiennej Zm
}
W przypadku instrukcji iteracyjnych kreacja i destrukcja zmiennej przebiega tyle razy, ile razy wyko-
nana zostanie dana pętla.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
6
Definiowanie zmiennych w  locie
{ while ( int Zm = Funkcja( ) ) {
int Zm = Funkcja( );
// Zakres widoczności zmiennej Zm
. . .
}
}


{ while ( ( int Funkcja( ) ) != 0 ) {
Zm =





( int = != 0;
Zm Funkcja( ) )

// Zakres widoczności zmiennej Zm
. . .
}
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
6
Definiowanie zmiennych w  locie
{ while ( int Zm = Funkcja( ) ) {
int Zm = Funkcja( );
// Zakres widoczności zmiennej Zm
. . .
}
}


{ while ( ( int Funkcja( ) ) != 0 ) {
Zm =





( int = != 0;
Zm Funkcja( ) )

// Zakres widoczności zmiennej Zm
. . .
}
}
Definiowanie zmiennych w  locie nie może łączyć ze sobą dodatkowych operacji podobnie jak zwy-
kłe definiowanie zmiennych.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
7
Przekazywanie parametru przez wartość
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
void Metoda( KlasaTest Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
KlasaTest ObA( A );
cout <<  main: 2 << endl;
ObA.Metoda(ObA);
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
7
Przekazywanie parametru przez wartość
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
void Metoda( KlasaTest Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
Wynik działania:
KlasaTest ObA( A );
main: 1
++ Konstruktor obiektu: A
cout <<  main: 2 << endl;
main: 2
ObA.Metoda(ObA);
... Metoda uruchomiona
cout <<  main: 3 << endl;
-- Destruktor obiektu: A
}
main: 3
-- Destruktor obiektu: A
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
7
Przekazywanie parametru przez wartość
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
void Metoda( KlasaTest Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
Wynik działania:
KlasaTest ObA( A );
main: 1
++ Konstruktor obiektu: A
cout <<  main: 2 << endl;
main: 2
ObA.Metoda(ObA);
... Metoda uruchomiona
cout <<  main: 3 << endl;
-- Destruktor obiektu: A
}
main: 3
-- Destruktor obiektu: A
Przy przekazywaniu parametru poprzez wartość na poziomie funkcji/metody tworzona jest kopia
obiektu. Zakończenie działania funkcji/metody kończy  życie tej kopii. Ale co z konstruktorem???
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
8
Konstruktor kopiujÄ…cy
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
void Metoda( KlasaTest Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
KlasaTest ObA( A );
cout <<  main: 2 << endl;
ObA.Metoda(ObA);
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
8
Konstruktor kopiujÄ…cy
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
void Metoda( KlasaTest Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
cout <<  main: 1 << endl; ++ Konstruktor obiektu: A
main: 2
KlasaTest ObA( A );
++ Konstruktor kopiujacy: A
cout <<  main: 2 << endl;
... Metoda uruchomiona
ObA.Metoda(ObA); -- Destruktor obiektu: A
main: 3
cout <<  main: 3 << endl;
-- Destruktor obiektu: A
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
8
Konstruktor kopiujÄ…cy
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
void Metoda( KlasaTest Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
cout <<  main: 1 << endl; ++ Konstruktor obiektu: A
main: 2
KlasaTest ObA( A );
++ Konstruktor kopiujacy: A
cout <<  main: 2 << endl;
... Metoda uruchomiona
ObA.Metoda(ObA); -- Destruktor obiektu: A
main: 3
cout <<  main: 3 << endl;
-- Destruktor obiektu: A
}
Przy tworzeniu kopii obiektu wywoływany jest niejawnie konstruktor kopiujący. W każdej klasie za-
wsze istnieje taki konstruktor niezależnie od innych konstruktorów.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
9
Konstruktor kopiujÄ…cy
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
public :
void Metoda( KlasaTest Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
KlasaTest ObA( A );




ObA.Metoda(ObA);
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
9
Konstruktor kopiujÄ…cy
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
public :
void Metoda( KlasaTest Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
KlasaTest ObA( A );




ObA.Metoda(ObA);
}
Konstruktor kopiujący musi być dostępny przed wywołaniem samej metody. Aby więc możliwe było
jego wywołanie musi on być dostępny na poziomie funkcji, z której wywoływana jest dana metoda.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
10
Przekazanie parametru przez referencjÄ™
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
void Metoda( KlasaTest & Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
KlasaTest ObA( A );
cout <<  main: 2 << endl;
ObA.Metoda(ObA);
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
10
Przekazanie parametru przez referencjÄ™
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
void Metoda( KlasaTest & Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
Wynik działania:
{
cout <<  main: 1 << endl;
main: 1
++ Konstruktor obiektu: A
KlasaTest ObA( A );
main: 2
cout <<  main: 2 << endl;
... Metoda uruchomiona
ObA.Metoda(ObA);
main: 3
-- Destruktor obiektu: A
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
10
Przekazanie parametru przez referencjÄ™
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
void Metoda( KlasaTest & Ob ) { cout <<  ... Metoda uruchomiona << endl; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
Wynik działania:
{
cout <<  main: 1 << endl;
main: 1
++ Konstruktor obiektu: A
KlasaTest ObA( A );
main: 2
cout <<  main: 2 << endl;
... Metoda uruchomiona
ObA.Metoda(ObA);
main: 3
-- Destruktor obiektu: A
cout <<  main: 3 << endl;
}
Przekazywanie parametru poprzez referencjÄ™ podobnie jak przekazywanie go przez wskaznik, nie
powoduje uruchomienia operacji kopiowania, gdyż metoda/funkcja działa na  oryginalnej zmiennej.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
11
Zwracanie obiektu przez wartość
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return KlasaTest(  X ); }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; } // . . . . . . . . . . . . . . . . . . . .
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; } // . . . . . . . . . . . . . . . . . . . . . .
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; } // . . . . . . . . . . . . . . . . . . . . . . . .
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
KlasaTest ObA( A );
cout <<  main: 2 << endl;
ObA = ObA.Metoda( );
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
11
Zwracanie obiektu przez wartość
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return KlasaTest(  X ); }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; } // . . . . . . . . . . . . . . . . . . . .
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; } // . . . . . . . . . . . . . . . . . . . . . .
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; } // . . . . . . . . . . . . . . . . . . . . . . . .
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
cout <<  main: 1 << endl; ++ Konstruktor obiektu: A
main: 2
KlasaTest ObA( A );
... Metoda uruchomiona
cout <<  main: 2 << endl;
++ Konstruktor obiektu: X
ObA = ObA.Metoda( ); -- Destruktor obiektu: X
main: 3
cout <<  main: 3 << endl;
-- Destruktor obiektu: X
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
11
Zwracanie obiektu przez wartość
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return KlasaTest(  X ); }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa)
{ cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; } // . . . . . . . . . . . . . . . . . . . .
KlasaTest( const char "Nazwa ): Nazwa(Nazwa)
{ cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; } // . . . . . . . . . . . . . . . . . . . . . .
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; } // . . . . . . . . . . . . . . . . . . . . . . . .
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
cout <<  main: 1 << endl; ++ Konstruktor obiektu: A
main: 2
KlasaTest ObA( A );
... Metoda uruchomiona
cout <<  main: 2 << endl;
++ Konstruktor obiektu: X
ObA = ObA.Metoda( ); -- Destruktor obiektu: X
main: 3
cout <<  main: 3 << endl;
-- Destruktor obiektu: X
}
Obiekt zwracany ma charakter obiektu tymczasowego, którego istnienie umożliwia przekazanie da-
nych na  zewnÄ…trz funkcji/metody. Po wykonaniu tego zadana jest unicestwiany.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
12
Operator przypisania
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return KlasaTest(  X ); }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
KlasaTest ObA( A );
cout <<  main: 2 << endl;
ObA = ObA.Metoda( );
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
12
Operator przypisania
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return KlasaTest(  X ); }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
++ Konstruktor obiektu: A
cout <<  main: 1 << endl;
main: 2
KlasaTest ObA( A );
... Metoda uruchomiona
cout <<  main: 2 << endl;
++ Konstruktor obiektu: X
... Przypisanie: A <- X
ObA = ObA.Metoda( );
-- Destruktor obiektu: X
cout <<  main: 3 << endl;
main: 3
}
-- Destruktor obiektu: A
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
12
Operator przypisania
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return KlasaTest(  X ); }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
++ Konstruktor obiektu: A
cout <<  main: 1 << endl;
main: 2
KlasaTest ObA( A );
... Metoda uruchomiona
cout <<  main: 2 << endl;
++ Konstruktor obiektu: X
... Przypisanie: A <- X
ObA = ObA.Metoda( );
-- Destruktor obiektu: X
cout <<  main: 3 << endl;
main: 3
}
-- Destruktor obiektu: A
Implementacja operatora przypisania ograniczająca zakres kopiowanych pól umożliwiła w tym przy-
padku zachowanie  tożsamości obiektowi, który poddany jest operacji przypisania.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
13
Obiekt tymczasowy
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return KlasaTest(  X ); }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
KlasaTest ObA( A );
cout <<  main: 2 << endl;
ObA = ObA.Metoda( ), cout <<  ... cdn. << endl;
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
13
Obiekt tymczasowy
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return KlasaTest(  X ); }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
++ Konstruktor obiektu: A
cout <<  main: 1 << endl;
main: 2
KlasaTest ObA( A );
... Metoda uruchomiona
cout <<  main: 2 << endl;
++ Konstruktor obiektu: X
... Przypisanie: A <- X
ObA = ObA.Metoda( ), cout <<  ... cdn. << endl;
... cdn.
cout <<  main: 3 << endl;
-- Destruktor obiektu: X
}
main: 3
-- Destruktor obiektu: A
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
13
Obiekt tymczasowy
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return KlasaTest(  X ); }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
++ Konstruktor obiektu: A
cout <<  main: 1 << endl;
main: 2
KlasaTest ObA( A );
... Metoda uruchomiona
cout <<  main: 2 << endl;
++ Konstruktor obiektu: X
... Przypisanie: A <- X
ObA = ObA.Metoda( ), cout <<  ... cdn. << endl;
... cdn.
cout <<  main: 3 << endl;
-- Destruktor obiektu: X
}
main: 3
-- Destruktor obiektu: A
Znak  ; jest terminatorem wykonywanej operacji. Wyznacza on czas życia obiektów tymczasowych.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
14
Zwracanie obiektu przez wartość
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return "this ; }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
KlasaTest ObA( A );
cout <<  main: 2 << endl;
ObA = ObA.Metoda( ), cout <<  ... cdn. << endl;
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
14
Zwracanie obiektu przez wartość
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return "this ; }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
++ Konstruktor obiektu: A
cout <<  main: 1 << endl;
main: 2
KlasaTest ObA( A );
... Metoda uruchomiona
cout <<  main: 2 << endl;
++ Konstruktor kopiujacy: A
... Przypisanie: A <- A
ObA = ObA.Metoda( ), cout <<  ... cdn. << endl;
... cdn.
cout <<  main: 3 << endl;
-- Destruktor obiektu: A
}
main: 3
-- Destruktor obiektu: A
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
14
Zwracanie obiektu przez wartość
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return "this ; }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
++ Konstruktor obiektu: A
cout <<  main: 1 << endl;
main: 2
KlasaTest ObA( A );
... Metoda uruchomiona
cout <<  main: 2 << endl;
++ Konstruktor kopiujacy: A
... Przypisanie: A <- A
ObA = ObA.Metoda( ), cout <<  ... cdn. << endl;
... cdn.
cout <<  main: 3 << endl;
-- Destruktor obiektu: A
}
main: 3
-- Destruktor obiektu: A
Zwrócenie przez wartość  samego siebie powoduje uruchomienie konstruktora kopiującego.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
15
Zwracanie obiektu przez referencjÄ™
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest & Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return "this ; }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
KlasaTest ObA( A );
cout <<  main: 2 << endl;
ObA = ObA.Metoda( ), cout <<  ... cdn. << endl;
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
15
Zwracanie obiektu przez referencjÄ™
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest & Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return "this ; }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Wynik działania:
cout <<  main: 1 << endl;
main: 1
KlasaTest ObA( A );
++ Konstruktor obiektu: A
cout <<  main: 2 << endl;
main: 2
... Metoda uruchomiona
ObA = ObA.Metoda( ), cout <<  ... cdn. << endl;
... Przypisanie: A <- A
cout <<  main: 3 << endl;
... cdn.
}
main: 3
-- Destruktor obiektu: A
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
15
Zwracanie obiektu przez referencjÄ™
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest & Metoda( ) { cout <<  ... Metoda uruchomiona << endl; return "this ; }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
Wynik działania:
cout <<  main: 1 << endl;
main: 1
KlasaTest ObA( A );
++ Konstruktor obiektu: A
cout <<  main: 2 << endl;
main: 2
... Metoda uruchomiona
ObA = ObA.Metoda( ), cout <<  ... cdn. << endl;
... Przypisanie: A <- A
cout <<  main: 3 << endl;
... cdn.
}
main: 3
-- Destruktor obiektu: A
Przekazanie obiektu przez referencjÄ™ nie wymaga wykonania operacji kopiowania.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
16
Czas życia obiektów tymczasowych
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda(KlasaTest Ob) { cout <<  ... Metoda << endl; return KlasaTest(  X ); }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
cout <<  main: 1 << endl;
KlasaTest ObA( A );
cout <<  main: 2 << endl;
ObA = ObA.Metoda(ObA), cout <<  ... cdn.\n ;
cout <<  main: 3 << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
16
Czas życia obiektów tymczasowych
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda(KlasaTest Ob) { cout <<  ... Metoda << endl; return KlasaTest(  X ); }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
++ Konstruktor obiektu: A
cout <<  main: 1 << endl;
main: 2
KlasaTest ObA( A );
++ Konstruktor kopiujacy: A
cout <<  main: 2 << endl; ... Metoda
++ Konstruktor obiektu: X
ObA = ObA.Metoda(ObA), cout <<  ... cdn.\n ;
... Przypisanie: A <- X
cout <<  main: 3 << endl;
... cdn.
}
-- Destruktor obiektu: X
-- Destruktor obiektu: A
main: 3
-- Destruktor obiektu: A
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
16
Czas życia obiektów tymczasowych
class KlasaTest { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
const char " const Nazwa;
public :
KlasaTest Metoda(KlasaTest Ob) { cout <<  ... Metoda << endl; return KlasaTest(  X ); }
KlasaTest & operator = ( constKlasaTest & Ob )
{ cout <<  ... Przypisanie:  << Nazwa <<  <-  << Ob. Nazwa << endl; return "this ; }
KlasaTest( const KlasaTest & Ob ): Nazwa(Ob. Nazwa) { cout <<  ++ Konstruktor kopiujacy:  << Nazwa << endl; }
KlasaTest( const char "Nazwa ): Nazwa(Nazwa) { cout <<  ++ Konstruktor obiektu:  << Nazwa << endl; }
<"
KlasaTest( ) { cout <<  -- Destruktor obiektu:  << Nazwa << endl; }
}; //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wynik działania:
int main( )
main: 1
{
++ Konstruktor obiektu: A
cout <<  main: 1 << endl;
main: 2
KlasaTest ObA( A );
++ Konstruktor kopiujacy: A
cout <<  main: 2 << endl; ... Metoda
++ Konstruktor obiektu: X
ObA = ObA.Metoda(ObA), cout <<  ... cdn.\n ;
... Przypisanie: A <- X
cout <<  main: 3 << endl;
... cdn.
}
-- Destruktor obiektu: X
Zakończenie operacji wyznaczone wystąpieniem znaku  ; wy-
-- Destruktor obiektu: A
main: 3
znacza czas życia obiektów tymczasowych.
-- Destruktor obiektu: A
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
17
Czas życia obiektów tymczasowych
int main( )
{
NazWektor W a( a , 1, 2), W b( b , 1, 1), W c( c , 1, 0), W d( d , 2, 2), W r( r );
cout <<   - Poczatek operacji dodawania        << endl;
W r = (W a + W b) + (W c + W d);
cout <<   - Koniec operacji dodawania       - << endl;
cout <<   - Rezultat:  << W r << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
17
Czas życia obiektów tymczasowych
int main( )
{
NazWektor W a( a , 1, 2), W b( b , 1, 1), W c( c , 1, 0), W d( d , 2, 2), W r( r );
cout <<   - Poczatek operacji dodawania        << endl;
W r = (W a + W b) + (W c + W d);
cout <<   - Koniec operacji dodawania       - << endl;
cout <<   - Rezultat:  << W r << endl;
}
Wykonywaniu poszczególnych operacji towarzyszy tworzenie się obiektów tymczasowych. Chcąc
prześledzić ten proces, należy przeciążyć odpowiednie konstruktory. Przeciążenia te muszą zapew-
niać możliwość nazwania obiektów, tak aby można było prześledzić okres życia poszczególnych
obiektów.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
18
Czas życia obiektów tymczasowych
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
NazWektor(const char "Nazwa, float x = 0, float y = 0 );
NazWektor( const NazWektor & W );
<"
NazWektor( );
NazWektor operator + ( const NazWektor & W ) const;
NazWektor & operator = ( const NazWektor & W );
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
char NazWektor:: ZnakCyfry =  0 ;
ostream & operator << ( ostream & ostrm, const NazWektor & W )
{
return ostrm << W. Nazwa <<  ( << W. x <<  ,  << W. y <<  ) ;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
18
Czas życia obiektów tymczasowych
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
NazWektor(const char "Nazwa, float x = 0, float y = 0 );
NazWektor( const NazWektor & W );
<"
NazWektor( );
NazWektor operator + ( const NazWektor & W ) const;
NazWektor & operator = ( const NazWektor & W );
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
NazWektor W(  a , 1, 2 );
char NazWektor:: ZnakCyfry =  0 ;
cout << W << endl;
}
ostream & operator << ( ostream & ostrm, const NazWektor & W )
{
Wynik działania:
return ostrm << W. Nazwa <<  ( << W. x <<  ,  << W. y <<  ) ;
a(1, 2)
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
18
Czas życia obiektów tymczasowych
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
NazWektor(const char "Nazwa, float x = 0, float y = 0 );
NazWektor( const NazWektor & W );
<"
NazWektor( );
NazWektor operator + ( const NazWektor & W ) const;
NazWektor & operator = ( const NazWektor & W );
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
NazWektor W(  a , 1, 2 );
char NazWektor:: ZnakCyfry =  0 ;
cout << W << endl;
}
ostream & operator << ( ostream & ostrm, const NazWektor & W )
{
Wynik działania:
return ostrm << W. Nazwa <<  ( << W. x <<  ,  << W. y <<  ) ;
a(1, 2)
}
Wprowadzenie dodatkowego pola statycznego pozwala numerować tworzące się tymczasowe
obiekty. Zaś pole Nazwapozwala nazywać każdy z obiektów.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
19
Definicje konstruktora i destruktora
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
NazWektor(const char "Nazwa, float x = 0, float y = 0 );
. . .
<"
NazWektor( );
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NazWektor::NazWektor( const char "Nazwa, float x, float y ): Nazwa(Nazwa)
{
x = x; y = y; cout <<  ++ Konstruktor:  << "this << endl;
}
NazWektor::<"NazWektor( )
{
cout <<  ++ Destruktor:  << "this << endl;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
19
Definicje konstruktora i destruktora
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
NazWektor(const char "Nazwa, float x = 0, float y = 0 );
. . .
<"
NazWektor( );
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NazWektor::NazWektor( const char "Nazwa, float x, float y ): Nazwa(Nazwa)
{
x = x; y = y; cout <<  ++ Konstruktor:  << "this << endl;
int main( )
}
{
NazWektor W(  a , 1, 2 );
}
NazWektor::<"NazWektor( )
{
Wynik działania:
cout <<  ++ Destruktor:  << "this << endl;
}
++ Konstruktor: a(1, 2)
-- Destruktor: a(1, 2)
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
19
Definicje konstruktora i destruktora
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
NazWektor(const char "Nazwa, float x = 0, float y = 0 );
. . .
<"
NazWektor( );
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NazWektor::NazWektor( const char "Nazwa, float x, float y ): Nazwa(Nazwa)
{
x = x; y = y; cout <<  ++ Konstruktor:  << "this << endl;
int main( )
}
{
NazWektor W(  a , 1, 2 );
}
NazWektor::<"NazWektor( )
{
Wynik działania:
cout <<  ++ Destruktor:  << "this << endl;
}
++ Konstruktor: a(1, 2)
-- Destruktor: a(1, 2)
Wywołanie konstruktora lub destruktora jest sygnalizowane odpowiednim komunikatem na wyjściu
standardowym. Podaje on nazwę i wartości pól obiektu.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
20
Konstruktor kopiujÄ…cy
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
. . .
NazWektor( const NazWektor & W );
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NazWektor::NazWektor( const NazWektor & W ): Nazwa( Tmp )
{
Nazwa += ++ ZnakCyfry;
x = y = 0;
cout <<  .. Kopiuje:  << "this <<  <- << W << endl;
x = W. x; y = W. y;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
20
Konstruktor kopiujÄ…cy
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
. . .
NazWektor( const NazWektor & W );
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
NazWektor W(  a , 1, 2 );
NazWektor::NazWektor( const NazWektor & W ): Nazwa( Tmp )
NazWektor V(W);
{
}
Nazwa += ++ ZnakCyfry;
x = y = 0;
Wynik działania:
cout <<  .. Kopiuje:  << "this <<  <- << W << endl;
++ Konstruktor: a(1, 2)
x = W. x; y = W. y;
++ Kopiuje: Tmp1(0,0) <- a(1, 2)
}
-- Destruktor: Tmp1(1, 2)
-- Destruktor: a(1, 2)
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
20
Konstruktor kopiujÄ…cy
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
. . .
NazWektor( const NazWektor & W );
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
NazWektor W(  a , 1, 2 );
NazWektor::NazWektor( const NazWektor & W ): Nazwa( Tmp )
NazWektor V(W);
{
}
Nazwa += ++ ZnakCyfry;
x = y = 0;
Wynik działania:
cout <<  .. Kopiuje:  << "this <<  <- << W << endl;
++ Konstruktor: a(1, 2)
x = W. x; y = W. y;
++ Kopiuje: Tmp1(0,0) <- a(1, 2)
}
-- Destruktor: Tmp1(1, 2)
-- Destruktor: a(1, 2)
Konstruktor kopiujÄ…cy w tym rozwiÄ…zaniu nie powoduje przepisanie nazwy obiektu. Jest to nie-
zbędne, aby móc zidentyfikować nowy obiekt. Jego nazwa tworzona jest automatycznie.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
21
Operator dodawania
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
. . .
NazWektor operator + ( const NazWektor& W ) const;
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NazWektor NazWektor::operator + ( const NazWektor& W ) const
{
cout <<  .. Dodanie:  << "this <<  +  << W << endl;
string Nazwa(  Tmp );
Nazwa += ++ ZnakCyfry;
return NazWektor( Nazwa.c str(), x+W. x, y+W. y );
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
21
Operator dodawania
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
. . .
NazWektor operator + ( const NazWektor& W ) const;
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
NazWektor W(  a , 1, 2 );
W = W + W;
NazWektor NazWektor::operator + ( const NazWektor& W ) const
}
{
cout <<  .. Dodanie:  << "this <<  +  << W << endl;
Wynik działania:
string Nazwa(  Tmp );
++ Konstruktor: a(1, 2)
Nazwa += ++ ZnakCyfry;
.. Dodanie: a(1, 2) + a(1,2)
return NazWektor( Nazwa.c str(), x+W. x, y+W. y );
++ Konstruktor: Tmp1(2, 4)
}
-- Destruktor: Tmp1(2, 4)
-- Destruktor: a(1, 2)
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
21
Operator dodawania
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
. . .
NazWektor operator + ( const NazWektor& W ) const;
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
NazWektor W(  a , 1, 2 );
W = W + W;
NazWektor NazWektor::operator + ( const NazWektor& W ) const
}
{
cout <<  .. Dodanie:  << "this <<  +  << W << endl;
Wynik działania:
string Nazwa(  Tmp );
++ Konstruktor: a(1, 2)
Nazwa += ++ ZnakCyfry;
.. Dodanie: a(1, 2) + a(1,2)
return NazWektor( Nazwa.c str(), x+W. x, y+W. y );
++ Konstruktor: Tmp1(2, 4)
}
-- Destruktor: Tmp1(2, 4)
-- Destruktor: a(1, 2)
W trakcie realizacji operacji dodawania tworzony jest obiekt tymczasowy, który przekazuje  na ze-
wnątrz wynik działania.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
22
Operator przypisania
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
. . .
NazWektor & operator = ( const NazWektor & W );
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NazWektor & NazWektor::operator = ( const NazWektor & W )
{
cout <<  .. Podstawienie: 
<< "this <<  =  << W << endl;
x = W. x; y = W. y;
return "this ;
}
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
22
Operator przypisania
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
. . .
NazWektor & operator = ( const NazWektor & W );
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
NazWektor W(  a , 1, 2 );
NazWektor & NazWektor::operator = ( const NazWektor & W )
W = W;
{
}
cout <<  .. Podstawienie: 
<< "this <<  =  << W << endl;
Wynik działania:
x = W. x; y = W. y;
++ Konstruktor: a(1, 2)
return "this ;
.. Podstawienie: a(1, 2) = a(1,2)
}
-- Destruktor: a(1, 2)
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
22
Operator przypisania
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
static char ZnakCyfry;
public :
string Nazwa;
float x, y;
. . .
NazWektor & operator = ( const NazWektor & W );
. . .
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
int main( )
{
NazWektor W(  a , 1, 2 );
NazWektor & NazWektor::operator = ( const NazWektor & W )
W = W;
{
}
cout <<  .. Podstawienie: 
<< "this <<  =  << W << endl;
Wynik działania:
x = W. x; y = W. y;
++ Konstruktor: a(1, 2)
return "this ;
.. Podstawienie: a(1, 2) = a(1,2)
}
-- Destruktor: a(1, 2)
Realizacja operacji podstawienia nie wymaga tworzenia żadnych obiektów tymczasowych. Zarówno
argument, jak też wynik działania, zwracane są przez referencje.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
23
W r = (W a + W b) + (W c + W d)
class NazWektor { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wynik działania:
static char ZnakCyfry;
++ Konstruktor: a(1, 2)
public :
++ Konstruktor: b(1, 1)
string Nazwa;
++ Konstruktor: c(1, 0)
float x, y;
++ Konstruktor: d(2, 2)
++ Konstruktor: r(0, 0)
NazWektor(const char "Nazwa, float x = 0, float y = 0);
 Poczatek operacji dodawania    -
NazWektor( const NazWektor & W );
<"
.. Dodanie: c(1, 0) + d(2, 2)
NazWektor( );
++ Konstruktor: Tmp1(3, 2)
.. Dodanie: a(1, 2) + b(1, 1)
NazWektor operator + ( const NazWektor & W ) const;
++ Konstruktor: Tmp2(2, 3)
NazWektor & operator = ( const NazWektor & W );
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.. Dodanie: Tmp2(2, 3) + Tmp1(3, 2)
++ Konstruktor: Tmp3(5, 5)
.. Podstawienie: r(0, 0) = Tmp3(5, 5)
. . .
++ Destruktor: Tmp3(5, 5)
++ Destruktor: Tmp2(2, 3)
int main()
++ Destruktor: Tmp1(3, 2)
{
NazWektor Wa( a ,1,2), Wb( b ,1,1), Wc( c ,1,0), Wd( d ,2,2);
 Koniec operacji dodawania    
NazWektor Wr( r );
 Rezultat: r(5, 5)
cout <<   Poczatek operacji dodawania   - << endl;
++ Destruktor: r(5, 5)
Wr = (Wa + Wb) + (Wc + Wd);
++ Destruktor: d(2, 2)
cout <<   Koniec operacji dodawania    - << endl;
++ Destruktor: c(1, 0)
cout <<   Rezultat:  << Wr << endl;
++ Destruktor: b(1, 1)
}
++ Destruktor: a(1, 2)
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
24
W r = (W a + W b) + (W c + W d)
. . .
 Poczatek operacji dodawania    -
.. Dodanie: c(1, 0) + d(2, 2)
W r = (W a + W b) + (W c + W d);
Ó!
++ Konstruktor: Tmp1(3, 2)
W r = (W a + W b) + Tmp1 ;
.. Dodanie: a(1, 2) + b(1, 1)
W r = (W a + W b) + Tmp1 ;
Ó!
++ Konstruktor: Tmp2(2, 3)
W r = Tmp2 + Tmp1 ;
.. Dodanie: Tmp2(2, 3) + Tmp1(3, 2)
W r = Tmp2 + Tmp1 ;
Ó!
++ Konstruktor: Tmp3(5, 5)
W r = Tmp3 ;
.. Podstawienie: r(0, 0) = Tmp3(5, 5)
W r = Tmp3 ;
++ Destruktor: Tmp3(5, 5)
W r -;
++ Destruktor: Tmp2(2, 3)
++ Destruktor: Tmp1(3, 2)
 Koniec operacji dodawania    
 Rezultat: r(5, 5)
. . .
W trakcie realizacji całej operacji tworzą się obiekty pośrednie, które przekazują wyniki częściowe.
Wszystkie one kończą swoje istnienie wraz z zakończeniem realizacji danej operacji, tzn. wtedy gdy
sterowanie  przekroczy znak średnika.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
25
Zapobieganie tworzeniu obiektów tymczasowych
class Wektor3f { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x, y;
NazWektor3f operator + ( Wektor3f W ) const { return W += "this ; }
Wektor3f & operator += ( const Wektor3f & W ) { x += W. x; y = W. y; return "this ; }
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
25
Zapobieganie tworzeniu obiektów tymczasowych
class Wektor3f { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x, y;
NazWektor3f operator + ( Wektor3f W ) const { return W += "this ; }
Wektor3f & operator += ( const Wektor3f & W ) { x += W. x; y = W. y; return "this ; }
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wektor3f W1, W2, W3;
W1 = W2 + W3; =Ò!
(W1 = W2) += W3;
Ilość obiektów tymczasowych: 2 Ilość obiektów tymczasowych: 0
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
25
Zapobieganie tworzeniu obiektów tymczasowych
class Wektor3f { // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public :
float x, y;
NazWektor3f operator + ( Wektor3f W ) const { return W += "this ; }
Wektor3f & operator += ( const Wektor3f & W ) { x += W. x; y = W. y; return "this ; }
}; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wektor3f W1, W2, W3;
W1 = W2 + W3; =Ò!
(W1 = W2) += W3;
Ilość obiektów tymczasowych: 2 Ilość obiektów tymczasowych: 0
Stosując bardziej przemyślany zapis operacji arytmetycznych można całkowicie wyeliminować two-
rzenie się obiektów tymczasowych.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
26
Podsumowanie
Przy stosowaniu przeciążeń operatorów zapis złożonych działań zazwy-
czaj wiąże się z powstawaniem obiektów tymczasowych. Ich liczbę
można prawie zawsze ograniczyć lub całkowicie je wyeliminować. Po-
woduje to jednak utratę czytelności zapisu takiego działania.
W przypadku gdy wymagania czasowe nie są krytyczne właściwym może
być zachowanie przejrzystości zapisu kosztem efektywności wykonywa-
nych operacji. Takie podejście jest szczególnie pomocne w początkowej
fazie tworzenia oprogramowania, gdyż zapobiega powstawaniu przypad-
kowych błędów w implementowanych wzorach.
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe
27
Pytania i ćwiczenia
1. Jeżeli byłaby możliwa następująca definicja konstruktora kopiującego kopiującego:
class Klasa {
public:
Klasa( Klasa Ob ) { }
};
to jakie byłyby konsekwencje w momencie jego użycia.
2. Zakładając, że klasa Wektor3f jest tak samo zdefiniowana jak w prezentowanym
wcześniej przykładzie, należy wyznaczyć liczbę powstających obiektów tymczaso-
wych dla wyrażenia:
Wr = Wa + Wb + Wc + Wd;
Zakres ważności, przekazywanie obiektów, obiekty tymczasowe


Wyszukiwarka

Podobne podstrony:
Egzamin# 06 08 zakres
08 Obowiązki pracowników szkoły w zakresie pracy z uczniem z ADHD
08 konstruktor kopiujacy prez
TI 99 08 19 B M pl(1)
Zasady rachunkowości w zakresie prawa podatkowego w Polsce
ei 05 08 s029
Wyklad 2 PNOP 08 9 zaoczne
Egzamin 08 zbior zadan i pytan
niezbednik wychowawcy, pedagoga i psychologa 08 4 (1)
Kallysten Po wyjęciu z pudełka 08

więcej podobnych podstron