EC++: const

Appunti tratti dalla rilettura di Effective C++ di Scott Meyers. Primo blocco: passare dal C al C++.

(1) const e inline sono da prefersi a #define

Il motivo é che #define é una direttiva al preprocessore, meglio invece é appoggiarsi sul compilatore, quando possibile, in modo da avere un miglior supporto nel debugging.

In pratica, invece di scrivere:

#define ASPECT_RATIO 1.653

É meglio scrivere:

const double ASPECT_RATIO = 1.653;

Ci sono alcune sottigliezze su questo punto.

La prima riguarda i puntatori. In questo caso const può essere usato per fare in modo che sia il puntatore sia il puntato siano costanti. Quindi se vogliamo che valgano entrambe le restrizioni dobbiamo usare const due volte:

const char * const authorName = "Scott Meyers";


La definizione di una costante all'interno di una classe é una faccenda un po' più complessa.

Per prima cosa la costante deve essere dichiarata come static:

class Something {
// ...
static const int index = 12;
};

E poi deve essere definita:

const int Something::index;

In alternativa, per costanti intere, é sempre possibile ripiegare sull'uso di un enumeratore:

class Something {
// ...
enum { INDEX = 5 };
};

Per quanto riguarda l'altro tipico uso della direttiva #define, la creazione di macro, il C++ mette a disposizione la possibilità di risolvere inline una funzione, eliminando il costo della chiamata ma mantenendo la sicurezza dei controlli forniti dal compilatore. Per ottenere l'effetto di avere un singolo blocco di codice valido per i diversi tipi di dato, abbiniamo la specifica inline al template, usando le possibilità offerte dalla programmazione generica in C++. Il risultato é che la nota macro del C per determinare il maggiore tra due valori:

#define max(a,b) ((a) > (b) ? (a) : (b))

Viene riscritta in C++ in questo modo:

template
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }

Nessun commento:

Posta un commento