Piccolo Cheat Sheet per il C++ parte 3

Terza parte del Cheat Sheet per il C++

  • Costruttori di copie

classname(const classname &ob) {

...

}

viene invocato solamente nelle inizializzazioni:

myclass x = y; // inizializzazione esplicita

func(y); // crea un oggetto temporaneo inizializzandolo a y

y = func(); // crea un oggetto temporaneo utilizzato per inizializzare y

x = y; // non è un'inizializzazione, quindi non richiama il costruttore di copie

  • Puntatori a funzioni con overloading

se non c’è overloading si può fare:

p = func;

con overloading è necessario esplicitare i parametri:

int func(int a);

int func(int a, int b);

int main()

{

int (*p)(int a);

p = func; // punta a func con un solo parametro

  • Argomenti standard delle funzioni

È possibile dichiarare parametri con valori di default nelle funzioni:

void func(int x=0)

{

...

}

...

func(5);

func();

i parametri standard devono essere specificati una sola volta (ad es. solo nel prototipo), i parametri standard devono comparire alla fine della lista dei parametri.

  • Overloading degli operatori

tipo nomeclasse::operator#(elenco-argomenti) // # va sostituito con l'operatore che si vuole ridefinire

{

...

}

se l’operatore è unario non ci sono parametri (l’unico parametro è l’oggetto stesso, quindi this), se l’operatore è binario c’è un solo parametro (l’operando di destra, quello di sinistra è l’oggetto stesso, this)

forme prefisse e postfisse di ++ e —

tipo operator++(); // per ++var

tipo operator++(tipo o); // per var++

è possibile anche fare l’overloading delle forme abbreviate +=, -=, ecc. ecc.

le funzioni operator#() non possono avere argomenti standard e non si può fare l’overloading di ., ::, .*, ?

tranne che per =, le funzioni operator#() sono ereditate dalle classi derivate

  • Overloading degli operatori tramite funzioni friend

in questo modo si devono esplicitare tutti gli operandi (in ordine da sinistra a destra), non è possibile per =, [], () e ->

per ++ e -- si deve utilizzare un parametro indirizzo, per le forme postfisse si usa un parametro aggiuntivo intero fittizio:

friend tipo operator++(tipo &ob, int x);

con le funzioni operator friend c’è maggiore flessibilità, ad esempio:

ob + 100; // ok sia con funzioni membro che con funzioni friend (il secondo parametro, o il primo nel caso di funzione membro, è dichiarato di tipo int)

100 + ob; // ok per le funzioni membro (basta dichiarare una versione con (int a, tipo b)), non è possibile con le funzioni membro perchè int è un tipo predefinito, quindi non posso ridefinire + per accettare il secondo operando del tipo di ob

  • Overloading di new e delete

È possibile fare l’overloading:

void *operator new(size_t size);

void operator delete(void *p);

void *operator new[](size_t size); // per array

void operator delete[](void *p); // per array

  • Overloading di []

tipo nomeclasse::operator[](int i); // per forza funzione membro

  • Overloading di ()

utilizzata per creare una funzione che accette un certo numero di parametri:

...

tipo nomeclasse::operator()(int a, double b, mclass c);

...

int main()

{

myclass x;

nomeclasse ob1, ob2(10, 3.4, x); //per ob2 chiamo il costruttore, perchè è la forma abbreviata di ob2 = nomeclasse(10, 3.4, x) utilizzata per l'inizializzazione

ob1(2,23.2,x); // equivale a ob1.operator()(2,23.2,x), non chiama il costruttore

  • Overloading di , (virgola)

in C++ è possibile fare l’overloading anche della virgola, operatore binario (il comportamento standard è quello di considerare in ordine i suoi operandi) es:

a = (b,c); // prima assegna b ad a, poi assegna c ad a

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...