Рассмотрим этот фрагмент кода Java:
Vertex a = graph.addVertex(null);
Vertex b = graph.addVertex(null);
Можно ли сделать то же самое в C++? AFAIK только в C++ будет:
Vertex& a = graph.addVertex(NULL);
Или, может быть, это:
typedef Vertex& Vertexref;
Vertexref a = graph.addVertex(NULL);
Конечно, возможно возвращение копии объекта.
Но синтаксис Java кажется мне более понятным. Было бы возможно иметь его в C++?
Вы можете подумать, что синтаксис Java более прост, но попробовали ли вы вернуть копию объекта на Java? Это гораздо менее прямолинейно. C++ позволяет вам ссылаться на ссылки, тогда как Java заставляет вас отказаться от ссылок. Качели и карусели.
Вы уже показали нам два способа написать это в C++, и они оба очень просты.
Объекты Java ссылаются указателями, даже если они не видны в синтаксисе так же, как в C++. Ваша функция Java действительно не возвращает ссылку (в смысле C++, а не только синоним для указателя), но возвращает указатель, и этот указатель возвращается значением. Таким образом, эквивалент C++ будет примерно таким:
Vertex* a = graph.addVertex(null);
Vertex* b = graph.addVertex(null);
Ошибочно думать о "ссылках" на Java как о том, что "ссылки" в C++. Java-ссылки являются указателями. C++ "ссылки" - это псевдонимы для переменных, что не то же самое, что и указатель, хотя они обычно (но не всегда) реализованы "под капотом" с помощью указателей.
Чтобы уточнить: это не просто терминология. Ваша программа C++ не будет вести себя так же, как ваша Java-программа, если вы просто переводите ссылки на Java на ссылки C++. Чтобы сделать эквивалентную C++ программу, вам нужно использовать указатели.
Vertex
для хранения общих указателей на его данные, если вы действительно не заботитесь о производительности.