Немой вопрос, но каждый раз, когда Вы называете новыми, у Вас всегда есть указатель?
SomeClass *person = new SomeClass();
И то, что, потому что Вам нужен указатель для указания на то новое пространство памяти, которая была выделена для человека переменной SomeClass?Спасибо!
Если new
завершается успешно, он всегда возвращает указатель (в случае неудачного завершения выдается исключение, и ничего возвращается).
Указатель - это созданный объект или, в случае массива, указатель на первый элемент массива.
Да. Если вы спрашиваете, почему вместо этого он не возвращает ссылку, поскольку ссылки лучше, чем указатели, ответ - историческое наследие.
Когда 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!
Новое выражение возвращает указатель, но вы можете использовать его с классами «умных указателей» (например, из Boost ). Итак:
boost::shared_ptr<SomePerson> person(new SomePerson);
Я также должен указать, что, хотя вы можете использовать круглые скобки, если вы пришли из фона Java, в C ++ скобки не нужны при использовании конструктора по умолчанию. Так, например, при построении по умолчанию обычно записывается new T
, но записывается new T (param)
или new T (param1, ..., paramN)
при создании объекта с использованием конструктора, отличного от конструктора по умолчанию.
Да, это правильно; теоретически можно было бы написать (new SomePerson) -> doSomething (), но это было бы утечкой памяти; В C ++ нет сборки мусора, поэтому необходимо сохранить результат нового выражения в чем-то (указателе или интеллектуальном указателе), чтобы его можно было должным образом освободить.
Да, всегда указатель. Даже если вы хотите перегрузить новый , тип возврата должен быть void * .
И вы правы насчет цели
new создает объект в куче, и все, что он может вернуть, - это его адрес - указатель.