/* my program in C++
   with few comments */

#include <iostream>

using namespace std;

int main ()
{
  cout << "Hello World! ";     // prints Hello World!
  cout << "I'm a C++ program"; // prints I'm a C++ program
  return 0;
}

--------------------Compilazione

g++ file.cpp

--------------------Variable identifiers

var
Var
var1
var2
var_new
var_2

--------------------Tipi di dati

char     1 byte

wchar_t  4 byte

int      intero di 4 byte (sistemi a 32 bit) 

float    floating point in singola precisione (4 byte)

double   floating point in doppia precisione (8 byte)

long double   floating point in doppia precisione (16 byte)

short int  2 byte

long int   8 byte

bool       valore booleano true o false

l'operatore sizeof consente di sapere la dimensione in byte
di un tipo o di una variabile:

a = sizeof (char);   // il risultato e' 1

--------------------Variable declaration

le variabili globali vengono dichiarate al di fuori della
funzione main() mentre le variabili locali sono dichiarate
all'interno di un blocco e sono valide dal punto in cui 
sono dichiarate fino alla fine del blocco {}

int a, b, c;

double result;

le variabili possono essere inizializzate al momento della dichiarazione:

int a = 0;
int a(0);

--------------------Strings

per usare le variabili di  tipo stringa 
occore il seguente header file:

#include <string>

string mystring;
mystring = "testo di una stringa di caratteri";

--------------------Costanti

75       costante int
75l      costante long int
3.1415   costante double
3e-9     costante double
3.1e8    costante double
3.2l     costante long double
3.2f     costante float
true     costante booleana
false    costante booleana
'a'      costante singolo carattere
"word"   costante stringa
"stringa definita \
su due righe"             costante stringa
l"wide characters string" costante stringa composta di wchar_t

alcuni caratteri speciali:

'\0' null
'\a' campanello
'\b' backspace
'\n' new line
'\t' tab
'\r' return
'\\' backslash
'\'' apice
'\"' virgolette "
'\xhh' carattere indicato in esadecimale

costanti definite dalla direttiva al preprocessore:

#define PI 3.14159
#define NEWLINE '\n' 

dichiarazione di costanti di tipo definito:

const int pathwidth = 100;
const char tabulator = '\t';

--------------------Operatori aritmetici e assignment 

+ - * / operatori aritmetici

% operatore modulo, riporta il resto intero di una divisione

a = 5*(2+b);
assegna il right value alla variabile a (left value)

a -= 2;        equivale ad a = a-2;
a /= 3;        equivale ad a = a/b;

++a     equivale ad a = a+1;
a++     come il precedente, ma l'incremento avviene dopo il calcolo dell'intera espressione

--------------------Operatori relazionali

== != > < >= <=

confrontano due espressioni, il risultato e' un valore booleano (true o false)

2+2 >= 5           (false)

2+2 == 4           (true)

--------------------Operatori logici

! && ||

combina espressioni booleane e quindi il suo risultato sara' true o false

(2+2)>3 && (3+3)<4   il risultato e' false
!false               il risultato e' true

--------------------Type casting operator

converte nel tipo posto tra parentesi:

int i;
float f = 3.14;
i = (int) f;

--------------------Input output

#include <iostream>
#include <string>
#include <sstream>

cout << "Hello" << endl;      // standard output
cin >> a;                     // standard input

usando l'operatore di estrazione (>>) sullo stream cin
si possono fornire sequenze di dati, ciascuno per ogni variabile, 
separati da un blank separator (space, tab, newline), purche'
la variabile sia definita del tipo giusto (int, double)

In alternativa si puo' leggere una intera linea come stringa di caratteri

string mystr;
getline (cin, mystr);         // legge la stringa nello standard input

string mystr = "1204";
int myint;
stringstream(mystr) >> myint; // converte la stringa in uno stream

string mystr;
int price;
getline (cin, mystr);
stringstream(mystr) >> price; // converte la stringa in uno stream
                              // legge il primo dato fino allo spazio

--------------------Input output con file

#include <iostream>
#include <string>
#include <fstream>

ofstream myfile;           // crea un file come stream e inserisce una linea
myfile.open ("file.txt");
myfile << "Writing this to a file.\n";
myfile.close ();

string line;               // legge da un file una linea alla volta
ifstream myfile;
myfile.open ("example.txt");
if (myfile.is_open())
 {
   while ( getline (myfile,line) )
   {
     cout << line << endl;
   }
   myfile.close();
 }

--------------------Strutture di controllo

if (condizione) {        // block
  statement1; 
  statement2;
}
else if {
}
else {
}

while (condizione) {
}

do {
} while (condizione);

for (int n=10; n>0; n--) {
}

for (n=10; n>0; n--) {
  cout << n << ", ";
  if (n==3) {
    cout << "countdown aborted!";
    break;           // uso del break per uscire dal loop
  }
}

for (int n=10; n>0; n--) {
  if (n==5) continue;       // uso di continue per saltare una iterazione
  cout << n << ", ";
}

switch (expression)
{
  case constant1:
     group of statements 1;
     break;
  case constant2:
     group of statements 2;
     break;
  default:
     default group of statements
}

--------------------Funzioni

type name (type par1, type par2, ...);      //declaration of function prototype

type name (type par1, type par2, ...) {     //argomenti per valore 
statements;
return ();
}

void name (type& par1, type& par2, ...) {   //argomenti per reference
statements;
return 0;
}

--------------------Array

int arr[5];
int arr[3][3];
int arr[] = {1, 2, 3, 4, 5};   //inizializzazione
arr[0] = 8;                    //accesso al primo elemento
arr[2][2] = 8;

sequenze di caratteri:
char myword [] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char myword [] = "Hello"; 

string mystring;
mystring = myword;             //trasformazione in stringa

--------------------Pointers

int var;
int * mypointer;               //declaration of poiter to int variable
mypointer = &var;              //address of var
*mypointer = 10;               //value poited by mypointer

--------------------Data structures

struct frutta {                //dichiarazione di una struttura
  int weight;                  //membri della struttura
  float price;
};

frutta mela;                   //type declaration "frutta"
frutta banana;

mela.price                     //utilizzo di un membro della struttura

frutta * pbanana;
pbanana = &banana;
pbanana->price;                //utilizzo di un puntatore alla struttura

--------------------Altri data types

typedef int word;              //definisce sinonimi di data types esistenti

enum enumeration_name {        //crea un nuovo data type 
  value1,
  value2,
  value3
};

enum colore_t {rosso, giallo, verde};
colore_t mycolor;
mycolor = rosso;

--------------------Classi

class class_name {       
  private:          //default, members accessibili solo da members della classe
    member1;
  public:           //members accessibili da tutti
    member2;        
  protected:        //members accessibili da members della stessa classe o classi derivate
    member3;        //i class members possono essere dichiarazioni di dati o funzioni
  };

class CRectangle {
    int x, y;
  public:
    void set_values (int a, int b){
      x = a;
      y = b;
    }
    int area () {return (x*y);}
};

class CRectangle {
    int x, y;
  public:
    void set_values (int,int);
    int area () {return (x*y);}
};
void CRectangle::set_values (int a, int b) {
  x = a;                   // operator of scope :: used to define 
  y = b;                   // a member of a class from outside the 
}                          // class definition itself

class CRectangle {
    int width, height;
  public:
    CRectangle (int,int);
    int area () {return (width*height);}
};
CRectangle::CRectangle (int a, int b) {    //constructor: funzione usata 
  width = a;                               //per inizializzare le variabili
  height = b;
}

CRectangle rect (3,4);   //il constructor viene chiamato quando si crea un oggetto della classe