All local variables, whether they come from classes or built-in types or whether they are arrays, are on the stack.
On the heap, all dynamic allocations are made.
Naturally, applying a modifier like static to a local variable will cause the variable to be placed elsewhere, preserving it across
function calls.
Additionally, to add to your confusion, if you establish a local pointer variable and set it to point to an object that was dynamically generated, for example
Class* a = new Class;
The memory that the variable a points to is on the heap, while the variable itself is on the stack.