Tak. Jeśli pytasz, dlaczego nie zwraca referencji zamiast tego, ponieważ odniesienia są ładniejsze niż wskaźniki, odpowiedź jest dziedzictwem historycznym.
Gdy C++ było w fazie rozwoju, jeśli maszyna nie mogła uzyskać pamięci dla obiektu, zwracany był specjalny wskaźnik NULL
. To jak to się robi w C:
SomeClass *person;
person = (SomeClass*) malloc(sizeof(SomeClass));
if (person == NULL) fprintf(stderr, "no more people allowed!");
W standardowej C++, błędy są zwracane przez wyjątkiem Zamiast:
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
}
Nadal można zrobić w staromodny sposób, choć z nothrow
:
SomeClass *person = new(std::nothrow) SomeClass;
if (person == NULL) std::cerr << "no more people allowed!" << std::endl;
Skutek jest taki, jest to całkowicie uzasadnione i dobry styl:
SomeClass &person = * new SomeClass; // don't need no stinkin pointers!
Zobacz także http://stackoverflow.com/questions/2697892/. – sbi