Второй, безусловно, предпочтительнее. Вы возвращаете ссылку на объект, который был новым. Для конечного пользователя, использующего программное обеспечение, не очевидно, что возвращаемый объект потребует удаления. ПЛЮС, если пользователь делает что-то подобное
Car myCar = dal.loadCar( id );
Указатель будет потерян.
Таким образом, ваш второй метод устанавливает контроль над памятью для вызывающего и предотвращает возникновение любых странных ошибок.
Редактировать: возврат по ссылке имеет смысл, но только когда родительский класс, то есть DAL, контролирует время жизни ссылки. т. е. если бы в классе DAL был вектор объектов Car, возвращение ссылки было бы вполне разумным.
Edit2: я бы все же предпочел вторую настройку. 3-й намного лучше, чем первый, но вы в конечном итоге заставляете абонента предполагать, что объект инициализирован.
Вы также можете предоставить
Car DAL::loadCar(int id);
И, надеюсь, примите копию стека.
Также не забывайте, что вы можете создать своего рода нулевой автомобильный объект, чтобы вы возвращали объект, который является «действительным» ишем, но не возвращает вам никакой полезной информации во всех полях (и, таким образом, очевидно, инициализируется для мусорных данных) , Это шаблон нулевого объекта.