Если вы должны получить действительный объект (т.е. вы не хотите, чтобы вызывающая сторона передавала NULL), то ни в коем случае не используйте boost :: shared_ptr. Ваш второй пример передает ссылку на «умный указатель» .... игнорируя детали, это «указатель на указатель на автомобиль». Поскольку он является ссылкой, объект shared_ptr не может иметь значение NULL .... но это не значит, что он не может иметь значение NULL (т. Е. Указывать на "нулевой" объект).
Я не совсем понимаю, почему вы думаете, что ссылка на умный указатель была бы "лучше" - функция вызывающего абонента уже использует умный указатель?
Что касается значения "const" ... ты имеешь в виду что-то вроде
bool DAL::loadCar(int id, const Car& car) {}
?
Если да, это будет контрпродуктивно, вы сообщаете компилятору о том, что «машина» не меняется (но, вероятно, вы хотите, чтобы она изменилась!).
Или вы хотите сделать функцию "const", что-то вроде
class DAL{
bool loadCar(int id, Car& car) const;
}
В последнем случае вы сообщаете пользователю компилятора / API, что метод loadCar не изменяет объект DAL. Это хорошая идея, если это так - не только то, что она позволяет оптимизировать некоторые компиляторы, но и вообще хорошо указывать в «контракте» (сигнатуре функции), что функция не вносит изменений в DAL, особенно если вы делаете это неявное предположение в своем коде (таким образом вы гарантируете, что это останется верным, и что в будущем никто не изменит функцию «loadCar» таким образом, который изменит объект «DAL»)