Да. Если вы спрашиваете, почему он не возвращает ссылку вместо этого, поскольку ссылки лучше указателей, ответ - историческое наследие.
Когда C ++ находился в разработке, если машине не удалось получить память для объекта, был возвращен специальный указатель NULL
. Вот как это делается в C:
SomeClass *person;
person = (SomeClass*) malloc( sizeof( SomeClass ) );
if ( person == NULL ) fprintf( stderr, "no more people allowed!" );
В стандартном C ++ ошибки возвращаются по исключению:
try {
SomeClass *person = new SomeClass;
// do something
} catch ( std::bad_alloc ) {
std::cerr << "no more people!" << std::endl;
} catch ( ... ) {
// using exceptions allows for other errors
// from inside SomeClass::SomeClass too
}
Вы все еще можете сделать это старомодным способом, с помощью nothrow
:
SomeClass *person = new( std::nothrow ) SomeClass;
if ( person == NULL ) std::cerr << "no more people allowed!" << std::endl;
В результате, это вполне разумный и хороший стиль:
SomeClass &person = * new SomeClass; // don't need no stinkin pointers!