//: C11:HowMany.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// A class that counts its objects
#include <iostream>
#include <string>
using namespace std;class HowMany
{
static int objectCount;
public:
HowMany()
{
objectCount++;
print("+HowMany()");}
static void print(const string& msg = "")
{
if(msg.size() != 0) cout << msg << ": ";
cout << "objectCount = "
<< objectCount << endl;}
~HowMany()
{
objectCount--;
print("~HowMany()");}
};
int HowMany::objectCount = 0;
/* Pass and return BY VALUE: */
HowMany f(HowMany x)
{
x.print("x argument inside f()");
return x;}
int main()
{
HowMany h;
/* Viene creato un nuovo oggetto di classe "HowMany" ed il contatore di oggetti sale ad 1.*/
HowMany::print("after construction of h");
HowMany h2 = f(h);/* All'invocazione di funzione viene creata una copia byteXbyte dell'oggetto h (il contatore di oggetti rimane invariato) e, poi, all'uscita dalla funzione viene invocato il distruttore dell'oggetto copia creato (il contatore torna a 0). Poi viene effettuato l'assegnamento al nuovo oggetto h2 e per fare questo viene fatta una copia byteXbyte (altro oggetto temporaneo creato ma il contatore rimane invariato); terminata l'assegnazione viene distrutto l'oggetto temporaneo (contatore a -1). Infine vengono distrutti "h2" e "h" ed il contatore scende a -3. */
HowMany::print("after call to f()");} ///:~