C++ Cpp03 zm dynam przeciazanie


WSKAŹNIKI == ZMIENNE WSKAŹNIKOWE
Zmienne wskaźnikowe zmienne przechowujące adresy (wskazania) identyfikujące umiejscowienie zmiennych lub innych obiektów w pamięci komputera.
definiowane są za pomocą operatora "("
np.
int( wsk ; // wskaźnik na zmienną całkowitą
double( wsk_liczby ; // wskaźnik na zmienną rzeczywistą
int( tab_wsk[ 10 ] ; // tablica dziesięciu wskaźników na int
int ((wsk_t)[ 10 ] ; // wskaźnik na tablicę 10-ciu liczb int
int( ((wsk_t)[ 10 ] ; // wskaźnik na tablicę 10-ciu wskaźników na int
int ((wsk_f)( int ) ; // wskaźnik na funkcję o argumencie int
int( ((wsk_f2)( int( ) ; // wskaźnik na funkcję o argumencie int(
// zwracającą wskazanie na int
int(( wsk_w ; // wskaźnik na zmienną zawierającą
// wskaźnik na int (tzn. wskaźnik na wskaźnik)


Zmienne wskaźnikowe umożliwiają adresowanie pośrednie !
pośredni dostęp do zmiennych za pomocą ich adresów:
np.
int liczba ; // zmienna typu całkowitego
liczba = 10 ; // bezpośrednie przypisanie wartości zmiennej
int( wsk ; // wskaźnik na zmienną typu całkowitego
wsk = &liczba ; // przypisanie wskaźnikowi adresu zmiennej "liczba"
(wsk = 10 ; // pośrednie przypisanie wartości (poprzez wskaźnik)

Zmienne wskaźnikowe umożliwiają również dostęp do zmiennych dynamicznych tworzonych w trakcie wykonywania programu w pamięci wolnej komputera.
np.
int( nowa_liczba=NULL ; // wskaźnik na nową zmienną typu całkowitego
nowa_liczba = new int ; // utworzenie nowej zmiennej całkowitej
(nowa_liczba = 10 ; // przypisanie wartości nowej zmiennej

DYNAMICZNE PRZYDZIELANIE PAMIĘCI
Pamięć komputera, dostępna dla programu, dzieli się na cztery obszary:
* kod programu,
* dane statyczne ( np. stałe i zmienne globalne programu),
* dane automatyczne (zmienne lokalne funkcji - tworzone i usuwane automatycznie przez kompilator) tzw. STOS (ang. stack)
* dane dynamiczne (zmienne, które można tworzyć i usuwać w dowolnym momencie pracy programu) w pamięci wolnej komputera tzw. STERTA (ang. heap)

Zmienne dynamiczne są to zmienne tworzone przez programistę w pamięci wolnej komputera (na stercie)
dostęp do takiej zmiennej możliwy jest jedynie poprzez jej adres w pamięci (przechowywany w zmiennej wskaźnikowej).

W języku "C" do dynamicznego przydzielania pamięci (tworzenia zmiennych dynamicznych) służyły specjalne funkcje np.:
void( malloc( size_t ilosc_bajtow ); //przydzielenie zadanej ilości bajtów
void free( void( adres ); //zwolnienie obszaru wskazywanego przez adres
W języku "C((" do dynamicznego przydzielania pamięci wygodniej jest wykorzystywać operatory new i delete :
= new [parametry_inicjacyjne] ;
delete ;
np.
int( wsk ; // wskaźnik na zmienną typu całkowitego
wsk = new int ; // utworzenie nowego obiektu (nowej zmiennej int)
if( wsk != NULL )
{
(wsk = 10 ; // przypisanie wartości (poprzez wskaźnik)
printf( "%d" , (wsk ); // wydrukowanie zawartości zmiennej dynam.
delete wsk ; // usunięcie zmiennej dynam. (zwolnienie pamięci)
}

PRZECIĄŻANIE NAZW FUNKCJI
W języku "C((" (w odróżnieniu od "C") można zdefiniować dowolną ilość funkcji o tej samej nazwie, ale o różnej ilości parametrów lub o różnym typie parametrów. Kompilator sam wybierze odpowiednią funkcję na podstawie ilości i typu parametrów przy wywołaniu.
np.
int MAX( int a, int b ) // Funkcja maksimum dla liczb całkowitych
{ return( a ( b ? a : b ); } // if(a>b) return(a); else return(b);

double MAX( double a, double b ) // Maksimum z liczb rzeczywistych
{ return( a ( b ? a : b ); }

struct Zespolona // Struktura opisująca liczby zespolone
{ double rzecz,uroj; } ;
#include
Zespolona MAX( Zespolona a, Zespolona b )
{ // Maksimum z liczb zespolonych
if( pow(a.rzecz,2) + pow(a.uroj,2) > pow(b.rzecz,2) + pow(b.uroj,2) )
return a;
else
return b;
}

int MAX( int a, int b, int c) // maksimum z trzech liczb całkowitych
{
int max=a;
if( max ( b ) max = b ;
if( max ( c ) max = c ;
return( max );
}

void main( void )
{
int i=3, j=7, k, l ;
double x=12.5, y=-3.25, z ;
Zespolona z1={2,-3}, z2={-1,2.5}, w ;
k = MAX( i, j ); // maksimum dla int
z = MAX( x, y ); // maksimum dla double
w = MAX( z1, z2 ); // maksimum dla Zespolona
l = MAX( i, j, k ); // maksimum z trzech liczb int
}

PRZECIĄŻANIE OPERATORÓW

W języku "C((" można zdefiniować nowe znaczenia standardowych operatorów dla obiektów nowych klas (podobnie jak jedna nazwa funkcji może posłużyć do zdefiniowania tej samej operacji dla kilku różnych typów).

Definiowanie nowego znaczenia operatorów pozwala zaprojektować bardziej typową i wygodną notację dla nowych obiektów.

Programista może napisać funkcje definiujące nowe znaczenia dla następujących operatorów :
+ ( ( / % ^ & | ~ !
= < > (( (( (( /( %( ^( &(
|= << >> >>( <<( (( ! ( <( >( &&
|| ++ (( (>( , (> [ ] ( ) new delete

Uwaga: Nie można zmienić składni ani pierwszeństwa w/w operatorów

Definicja nowego znaczenia dowolnego operatora @ wygląda następująco:

1) Dla operatorów jednoargumentowych: @ x np. ( x lub ++x
operator @ ( x )
{
// definicja sposobu działania operatora dla danej typu
}

np. negacja liczby zespolonej:
Zespolona operator ( ( Zespolona x )
{
x.rzecz = ( x.rzecz ;
x.uroj = ( x.uroj ;
return( x );
}

// przykład wykorzystania
Zespolona a, b ; // utworzenie dwóch zmiennych zespolonych
b = operator ( ( a ) ; // jawne wywołanie funkcji operatorowej
b = (a ; // użycie samego operatora jest skrótem wywołania w/w funkcji
2) Dla operatorów dwuargumentowych: x @ y np. x+y lub x+=y
operator @ ( x , y )
{
// definicja działania operatora dla dwóch danych typu
}


np. sumowanie liczb zespolonych:
Zespolona operator + ( Zespolona x, Zespolona y )
{
Zespolona suma;
suma.rzecz = x.rzecz + y.rzecz ;
suma.uroj = x.uroj + y.uroj ;
return( suma );
}

// przykład wykorzystania
Zespolona a, b, c ; // utworzenie trzech zmiennych zespolonych
c = operator + ( a, b ) ; // jawne wywołanie funkcji operatorowej
c = a + b ; // użycie samego operatora jest skrótem wywołania w/w funkcji



np. operator przypisania z sumowaniem:
// UWAGA !!! Pierwszy argument musi być przekazywany przez referencję.
Zespolona operator += ( Zespolona &x, Zespolona y )
{
x.rzecz += y.rzecz ;
x.uroj += y.uroj ;
return( x );
}

// przykład wykorzystania
Zespolona a, b ; // utworzenie dwóch zmiennych zespolonych
operator += ( a, b ) ; // jawne wywołanie funkcji operatorowej
a += b ; // użycie samego operatora jest skrótem wywołania w/w funkcji

M.P. "Prog.Obiekt." (Cpp03) ( 1 ( Dynamiczne przydzielanie pamięci

M.P. "Prog.Obiekt." (Cpp03) ( 6 ( Przeciążanie funkcji

M.P. "Prog.Obiekt." (Cpp03) ( 7 ( Przeciążanie operatorów



Wyszukiwarka

Podobne podstrony:
Ochrona przeciwporażeniowa w urzadzeniach nN spodz zm
6 ŁSkłodowski mosty dynam
Niesteroidowe leki przeciwzapalne 2
czym sa przeciwutleniacze
przeciekający dach
Fuzje i przejęcia wykład fuzje przeciek
przeciwdepresyjny
62 FOR ostrzega Wprowadzenie klauzuli przeciwko unikaniu opodatkowania może być niezgodne z Konstytu
7 antybiotyki niesklasyfikowane i leki przeciwgruźlicze
bezpieczeństwo stosowania leków przeciwbólowych
Leki przeciwhistaminowe
Ustawa o wychowaniu w trzeźwości i przeciwdziałaniu alkoholizmowi D20160487L

więcej podobnych podstron