У меня есть функция в двоичном дереве поиска, который возвращает адрес определенного узла:
binary_tree_node*& left( ) { return left_field; }
Я отмечаю, что "&" означает передать адрес поля left_field. Если я удалил "&", означает ли это, что он представит ошибку компилятора, когда я использую функцию ниже?
root->left()=new binary_tree_node<ItemType>(9);
Я отмечаю, что "&" означает передать адрес поля left_field
В этом случае "&" означает "ссылка", а не "адрес",
Таким образом, вы возвращаете ссылку на указатель, а не на адрес указателя.
Эта строка не будет компилироваться без "&":
root->left()=new binary_tree_node<ItemType>(9);
потому что вы назначаете значение временному указателю (возврат функции left()). Хотя, если вы используете ссылку, возвращаемый указатель находится внутри вашего класса.
Сначала попробуйте прочитать его правильно:
T *&
Прочтите его справа налево, это ссылка на указатель на объект типа T
Таким образом, эта функция возвращает ссылку на указатель binary_tree_node
. Функция, которая возвращает ссылку, может быть помещена в левую часть задания, и вы можете изменить значение объекта, на который ссылается. Эта строка ведет ссылочный объект, который является указателем, указывает на вновь построенный объект:
root->left() = new binary_tree_node<ItemType>(9);
Да, будет ошибка компилятора, потому что возвращаемый объект имеет значение rvalue. Но если я не ошибаюсь, то MS VC++ (по крайней мере MS VC++ 2010) скомпилирует его, потому что у компилятора thsi есть ошибка.
root->left()
? Если это не внутри метода класса, вы можете пересмотреть свой дизайн, чтобы иметь лучшую инкапсуляцию. Если это внутри метода класса, почему бы просто не присвоитьleft_field
?