You are not pushing a reference. In the both cases you are pushing a pointer to an object of type Course I think that using CScourse() in the first example is a typo) . The difference is that in the first case we know that we are pushing a pointer that points to an object created in the heap while in the second case we can say nothing about where the object was created.