C++ - Experimente ... : 2009/2010 - Suceava
C++ - Experimente ... : 2009/2010 - Suceava
2009/2010 - Suceava
#include <iostream>
#include <math.h>
using namespace std;
class Test
{
public:
int x;
static int y;
//private:
Test( void )
{
cout<<"\nCONSTRUCTOR: [ "<<this<<" ]"<<endl; }
~Test( )
{
cout<<"\nDESTRUCTOR: [ "<<this<<" ]"<<endl; }
void Functie( void ) {}
};
int Test::y = 0;
int main()
{
cout << "-[ START ]------------------" << endl;
Test ob;
void (Test::*pf)( void );
cout<<"\nDimensiune clasa: "<< sizeof( Test )<<endl;
cout<<"\nAdresa obiect \'ob\': [ "<< &ob <<" ]"<<endl;
cout<<"\nDimensiune obiect: "<< sizeof( ob )<<endl;
cout<<"\n\t- Adresa \'ob.x\': "<< &ob.x <<endl;
cout<<"\n\t- Dimensiune \'ob.x\': "<< sizeof( ob.x )<<endl;
cout<<"\n\t- Adresa \'ob.y\': "<< &ob.y <<endl;
cout<<"\n\t- Dimensiune \'ob.y\': "<< sizeof( ob.y )<<endl;
ob.Functie();
cout<<"\nAdresa SIN(): [ "<< (void*)sin <<" ]"<<endl;
//cout<<"\nob.Functie: [ "<< ob.Functie <<" ]"<<endl;
cout << "-[ END ]--------------------" << endl;
return 0;
}
http://en.cppreference.com/w/cpp/language/types
2009/2010 - Suceava
#include <iostream>
using namespace std;
class Test
{
public:
int x;
Test( ){cout<<"\nConstructor"<<endl;}
~Test( ){cout<<"\nDestructor"<<endl;}
};
int main (void)
{
Test b;
// apel ddestructor: este obligatoriu prefixul "Test::"
b.Test::~Test();
b.x = 2;
return 0;
}
2009/2010 - Suceava
#include <iostream>
using namespace std;
class MyClass
{
char *sir;
public:
MyClass(char *_sir="zona statica"):sir(_sir)
{
std::cout << "ctor: [" << this<<"] "<<sir<<std::endl;
}
~MyClass()
{
std::cout << "dtor: [" << this<<"] "<<sir<<std::endl;
}
};
2009/2010 - Suceava
2009/2010 - Suceava
Observatie
2009/2010 - Suceava
2009/2010 - Suceava
2009/2010 - Suceava
int main(void)
{
cout << "-[ START ]------------------" << endl;
//Declarare pointeri la membri
px = &Test :: x;
pf = &Test ::functie;
//Declarare obiecte
Test a, *pa; pa = &a; //pa=adresa lui a
//Acces la membri prin pointeri la membri
a.*px = 3;
pa->*px = 2;
(a.*pf)( 2, 2 );
(pa->*pf)( -1, -1 );
cout << "-[ END ]--------------------" << endl;
return 0;
}
2009/2010 - Suceava
2.
3.
4.
5.
.*
::
?:
2009/2010 - Suceava
2009/2010 - Suceava
#include <iostream>
using namespace std;
class Complex
{
float re, im;
char name[20];
public:
Complex( char *_name = "_DEFAULT_", float _r = 0,
float _i = 0 ) : re(_r), im(_i)
{
strcpy( name, _name );
}
Complex operator +( Complex &b );
Complex operator +( float b );
void Print( void )
{
cout.width(10);
cout<<name<<": "<<re<<(im<0 ? " -i ":" +i ");
cout<<fabs( im )<<endl;
};
friend Complex operator +( float a, Complex &b );
};
2009/2010 - Suceava
2009/2010 - Suceava
2009/2010 - Suceava
Exemplu
class Test
{
void operator *( float y );
friend void operator /( float y, Test &x );
};
void Test::operator *( float y )
{
}
void operator /( float y , Test &x )
{
}
2009/2010 - Suceava
Concluzie
Atunci cand primul operand nu este de tipul clasei ( 2 / ob2 ) suntem nevoiti sa
supradefinim operatorul doar prin functie PRIETENA friend
Atunci cand primul operand este de tipul clasei ( ob1 * 3 ) putem adopta mabele
metode
Test ob;
ob2 = ob1 * 3;
( EXPLICATI )
2009/2010 - Suceava
OPERATORII DE ASIGNARE
Operatori utilizai :
Atunci cnd dorim ca printr-o atribuire ntre dou obiecte s realizam un tratament special
asupra datelor membre i nu numai o copiere bit cu bit, suntem nevoii s redefinim acei
operatori de atribuire utilizai de obiectul clasei respective.
Dac o clas nu are redefinit nici un operator de atribuire, compilatorul i va genera unul,
implicit ce va realiza o copiere bit cu bit.
Ca i n cazul constructorului de copiere printr-o copiere bit cubit a datelor de tip pointer
are loc o partajare a celeiai zone de memorie indicat de pointerul membru ntre cele
dou obiecte (pentru c a fost copiat adresa i nu a fost multiplicat zona).
Primul obiect care dispare va dealoca zona de memorie comun i (celorlalte) celuilalt
obiect.
Atunci cnd rezultatul operatorului este calculat ntr-o variabil local lui vom returna un
obiect iar cnd rezultatul este chiar obiectul curent putem returna o referin.
2009/2010 - Suceava
OPERATORII DE ASIGNARE
Sintaxa de redefinire :
<tip_ret>operator= ( <tip_arg> <arg> );
Observatie
n loc de = putem utiliza unul din simbolurile + =, - = , * = , % =, ... . Acestea sunt
tratate ca fiind un singur operator i nu combinaii de simboluri.
Atunci cnd avem atribuiri de forma : a=b=c; i cnd funcia operator este funcie
membr, scrierea expandat va fi de forma :
a.operator=( b.operator= ( c ) );
Atunci cnd funcia operator este funcie prieten scrierea expandat este de forma :
operator=( a, operator= ( b,c ) );
Operatorii care se execut de obicei n cadrul funciei operator = pot fi sintetizai n
forma urmtoare:
2009/2010 - Suceava
#include <iostream>
using namespace std;
class Test
{
char *p;
int x;
public :
Test& operator= (Test &b );
};
Test& Test :: operator= ( Test& b )
{
if( this == &b )//autocopiere pt. a=a
// in cazul *this= =b comparam doua
// obiecte iar daca, clasa respectiv
// nu are redefinit operatorul
// == se returneaza eroare
return *this;
// se dealoca vechea zona de memorie
// se calculeaza dimensiunea pentru zona de alocat
// se aloc memorie pentru p
// se copie informatia din b.p n p
// se face x= b.x
return *this;
};
2009/2010 - Suceava
Vom da un exemplu n care vom redefini din nou ecelai operator i vom utiliza funcia
prieten.
#include <iostream>
using namespace std;
class Test
{
char *p;
int
x;
public:
//Test& operator= (Test& b);
friend Test& operator=( Test& a, char *s );
};
Test& operator=( Test& a, char *s )
{
//nu este necesar testul deoarece avem obiecte diferite
if( a.p )
delete a.p;
a.p = new char[ strlen(s) + 1 ];
strcpy( a.p, s );
a.x = atoi( s ); // x=0;
return a; // nu am facut *this deoarece nu este o membra
}
2009/2010 - Suceava
OPERATORUL de INDEXARE []
Acest operator poate fi utilizat n asocier cu un obiect, realiznd anumite operaii
specifice asupra datelor membre, de exemplu returnnd valoarea unui element de pe
o anumit poziie.
Nu sunt restricii la tipul de dat returnat i nici la tipul de dat primit ca argument.
#include <iostream>
using namespace std;
class Test
{
public:
char s[20], _err;
char& operator []( int i );
};
char& Test :: operator [] (int i)
{
return i >=0 && i<20 ? s[i] : _err ;
// returneaza un anumit element de pe o
// anumit poziie cu verificarea poziiei i a indexului
}
int main( void )
{
Test ob;
ob[ 0 ] = 'P'; ob[ 1 ] = 'O'; ob[ 2 ] = 'O'; ob[ 3 ] = '\0';
cout<< "Continutul: "<< ob.s <<endl;
return 0;
}