Как вернуть ссылку на объект c
Перейти к содержимому

Как вернуть ссылку на объект c

  • автор:

Как работает возврат ссылки?

Что-то я туплю. Есть класс буфера, который, возвращая элемент, копирует его в свой член OutObject и возвращает ссылку на OutObject. Принимается же этот элемент в объект:

К какой области памяти теперь относится data? К той же, что и раньше? Или к OutObject? Или здесь все же происходит копирование значения?

о боже, ответ получился безумно длинным и без BBcode выглядит ужасно нечитабельно :((

не пугайтесь огромного размера :))

предисловие

что такое ссылка ?

все ссылки это по сути константные указатели (не путать с указателем на конст)

у ссылок есть пара отличий от просто указателя

  1. нельзя менять адрес_объекта
  2. адрес_объекта не может быть равным нулю
  3. тип ссылки и объекта должен быть одинаковым
  4. адрес_объекта можно назначить только во время создания ссылки

во время компиляции, компилятор автоматически переделает ссылку в конст_переменная_указатель , возьмёт адрес_объекта и во всех местах где используется ссылка подставит разыменование ( * конст_переменная_указатель ).

передача\возврат значений в\из функцию

главное всегда помнить в функцию ничего не передаётся и функция ничего не возвращает

на самом деле вы создаёте в функции новую переменную и присваиваете ей значение из вызвавшей_функции (эта переменная может быть указателем, ссылкой или объектом)

при возврате вы создаёте в вызвавшей_функции новую переменную и присваиваете ей значение из функции (эта переменная так же может быть указателем, ссылкой или объектом. Она имеет адрес в памяти но не имеет имени)

создаём в функции новые переменные

—————пример1:

при вызове fun() в месте $ будет выполнена операция

—————пример2:

при вызове fun() в месте $ будет выполнена операция

—————пример3: (работать не будет)

при вызове fun() в месте $ будет выполнена операция

создаём в вызвавшей_функции переменные без имени «^»

—————пример1:

в вызвавшей_функции в месте $ будет выполнена операция

—————пример2:

в вызвавшей_функции в месте $ будет выполнена операция

—————пример3: (работать не будет)

в вызвавшей_функции в месте $ будет выполнена операция

смешиваем

—————пример:

в функции_fun в месте $1 будет выполнена операция

затем в вызвавшей_функции в месте $2 будет выполнена операция

тоесть ^_ссылка и переменная_1_ссылка будут указывать на переменная_объект

если кто не понял привожу аналогичный код в виде указателей

в функции_fun в месте $1 будет выполнена операция

затем в вызвавшей_функции в месте $2 будет выполнена операция

p.s стоит ли писать про то когда вызывается конструктор_копирования , а когда оператор= .

Как вернуть ссылку на объект?

Здравствуйте!
Стоит задача применения сразу двух методов к одному объекту класса. Например, имеется объект с класса Complex. Необходимо, чтобы подобная конструкция работала корректно: c.sum(a).sub(b). Как я понимаю, необходимо, чтобы метод sum возвращал ссылку на объект, чтобы второй метод корректно применился.

Прошу пояснить как это сделать. Возможно ли это реализовать без помощи создания временного объекта, то есть вернуть сразу ссылку на обновленный объект c?

Как вернуть ссылку на объект c

Кроме параметров метода, которые с помощью модификатора ref позволяют передавать значение по ссылке, C# также позволяет с помощью ключевого слова ref возвращать ссылку из метода и определять переменную, которая будет хранить ссылку.

Переменная-ссылка

Для определения локальной переменной-ссылки (ref local) перед ее типом ставится ключевое слово ref :

Здесь переменная xRef указывает не просто на значение переменной x, а на область в памяти, где располагается эта переменная. Для этого перед x также указывается ref.

При этом мы не можем просто определить переменную-ссылку, нам обязательно надо присвоить ей некоторое значение. Так, следующий код вызовет ошибку:

Получив ссылку, мы можем манипулировать значением по этой ссылке. Например:

Ссылка как результат функции

Для возвращения из функции ссылки в сигнатуре функции перед возвращаемым типом, а также после оператора return следует указать ключевое слово ref :

В методе Find ищем число в массиве, но вместо самого значения числа возвращаем ссылку на него в памяти. Для этого в сигнатуре метода в качестве типа результата функции указывается не просто int , а ref int .

Кроме того, в самом методе после слова return также ставится ref :

Тем самым мы получаем не просто значение, а ссылку на объект в памяти.

В методе Main для определения переменной, которая будет содержать ссылку, используется ключевое слово ref. При вызове метода также указывается слово ref:

В итоге переменная numberRef будет содержать ссылку на объект int, и через данную переменную в последствиии мы можем изменить объект по этой ссылке.

Другой пример — возвращение ссылки на максимальное число из двух:

Стоит обратить внимание, что параметры метода в этом случае определены с ключевым словом ref.

При определении метода, который возвращает ссылку, следует учитывать, что такой метод естественно не может иметь тип void. Кроме того, такой метод не может возвращать:

Как функции возвратить ссылку на объект?

Что можно возвратить из функции если нужный объект не создан
Добрый день! Есть функции, которые возвращают указатели на двумерные массивы, но заполнение и.

Как преобразовать ссылку на объект в указатель на этот объект?
Как преобразовать ссылку на объект в указатель на этот объект? Буду благодарен за помощь.

Как возвратить несколько значений в функции?
Функция, реализующая обобщенный алгоритм Евклида. Нужно вернуть 3 значения: gcd, x и y. То есть.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *