Già ma prova così:
codice:
#include <iostream>
using namespace std;

#define SIZE 100

// Creazione della classe stack.
class stack {
  int stck[SIZE];
  int tos;
public:
  stack();  // costruttore
  ~stack(); // distruttore
  void push(int i);
  int pop();
};

// costruttore dello stack
stack::stack()
{
  tos = 0;
  cout << "Stack inizializzato\n";
}

// distruttore dello stack
stack::~stack()
{
  cout << "Stack distrutto\n";
}

void stack::push(int i)
{
  if(tos==SIZE) {
    cout << "Stack esaurito.\n";
    return;
  }
  stck[tos] = i;
  tos++;
}

int stack::pop()
{
  if(tos==0) {
    cout << "Stack vuoto.\n";
    return 0;
  }
  tos--;
  return stck[tos];
}

int main()
{
  stack *a, *b;  // crea due oggetti della classe stack
  a = new stack();
  b = new stack();
  a->push(1);
  b->push(2);

  a->push(3);
  b->push(4);

  cout << a->pop() << " ";
  cout << a->pop() << " ";
  cout << b->pop() << " ";
  cout << b->pop() << "\n";
  delete a;
  delete b;
  return 0;
}
Evidentemente il istruttore viene chiamato solo per allocazioni nello heap e non nello stack di sistema, (non lo sapevo neanche io confesso)