Потому что переменные в C# по умолчанию это ссылки на объекты. Это сделано для оптимизации передачи объектов и сборщика мусора.
А в С++ нужно всегда явно указывать тип переменной: указатель, ссылка или значение(по умолчанию) и вручную контролировать тип размещения в памяти: авто/стек(по умолчанию в функциях), статик или куча.
Ну и в данном пример нужно указатель на obj потом еще вернуть из функции или удалить(delete obj) в конце нее, иначе будет утечка памяти. Встроенного сборщика мусора в С++ пока нет.