#include <iostream>

struct s {
   int n;

   s( ) {
      n = 0;
   }

   s(s& v) {
      std::cout << "constructor por copia\n";
      n = v.n;
   }

   ~s( ) {
      std::cout << "destructor\n";
   }
};

void paso_valor(s v) {
   v.n += 1;      // modifica la copia y luego la tira
}

void paso_referencia(s& v) {
   v.n += 1;      // modifica el original
}

void paso_referencia_const(const s& v) {
   //v.n += 1;    // si se descomenta no compilará: const prohibe modificar v
}

int main( ) {
   s v;
   std::cout << "llamando a funcion con paso por valor...\n";
   paso_valor(v);
   std::cout << "\n";

   std::cout << "llamando a funcion con paso por referencia...\n";
   paso_referencia(v);
   std::cout << "\n";

   std::cout << "llamando a funcion con paso por referencia a const...\n";
   paso_referencia_const(v);
   std::cout << "\n";

   std::cout << "fin de main\n";
}
