js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
|
js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
|
js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Господа, Вы согласны с автором? Мне одному кажется, что тут что то не так?
|
Re: js - по ссылке или по значениею | |
---|---|
Taran Сообщений: 13624 Откуда: Красноярск Дата регистрации: 16.01.2008 |
Исправлено 1 раз(а). Последнее : Taran, 27.12.16 18:20 |
Re: js - по ссылке или по значениею | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Годный пример. В JS вариант setName(@loObj2) невозможен, о чём и пишется в книжке. Другое дело насколько часто подобный приём применяется в том же фоксе...
------------------ WBR, Igor |
Re: js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
В С и С++ передача параметра "по значению" - это когда в стек сохраняется само значение, а передача параметра "по ссылке" - это когда в стек сохраняется адрес объекта. Числа передаются "по значению", объекты и массивы - по ссылке. Так же, всегда можно узнать адрес, по которому хранится адрес объекта, и передать этот адрес (адрес адреса!) в функцию - в этом случае в функции для обращения к объекту придётся использовать звёздочку! Как сказал мой преподаватель Дроздов Ф.Н. - "эта звёздочка очень многим жизнь испортила". VFP штука гораздо более высокоуровневая, чем C/C++. На сколько понимаю, на VFP в случае setName(loObj) в функцию передаётся указатель на объект (указатель - это тот же адрес), в obj хранится указатель на объект. Когда внутри функции setName выполняется obj = CreateObject('empty'), в локальную переменную obj помещается указатель на другой объект. А в случае setName(@loObj2) в функцию передаётся адрес указателя на объект. Но, VFP штука высокоуровневая, и его разработчики прекрасно понимают, что адрес указателя на объект (адрес адреса) нужен именно для доступа к объекту (а не к адресу объекта). Потому, если в функцию передаётся "адрес адреса объекта", VFP понимает, что ему передали, и корректно обращается к объекту. По сути, пользователя избавляют от работы с адресами. Так вот. В случае setName(@loObj2) в obj содержится "адрес адреса объекта", и при выполнении obj = CreateObject('empty') адрес нового объекта сохраняется в "адрес объекта". При этом "адрес адреса объекта" не меняется! В своё время осознание этого факта мне немножко взорвало мозг.
Тут все согласны? Исправлено 1 раз(а). Последнее : S-type, 28.12.16 09:31 |
Re: js - по ссылке или по значениею | |
---|---|
of63 Сообщений: 25244 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Взорвало, согласны.
|
Re: js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
А такой пример?
Разве? Передача объекта "по ссылке" это когда мы можем из функции менять объект, ссылка (указатель, адрес) на который передана. Т.е. объект находится "где то там", и есть другие указатели на объекты. Мы изменили объект, при этом все другие, у кого есть указатели на этот объект, увидят изменения в объекте. А изменение значения самого указателя на объект приводит не к изменению объекта, а к изменению указателя. Все остальные указатели на объект не меняются. Разве не так? Исправлено 1 раз(а). Последнее : S-type, 28.12.16 10:14 |
Re: js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Описанный выше пример переписал на C#:
Корректно перевёл? Сделать одну setName не получилось. Исправлено 1 раз(а). Последнее : S-type, 28.12.16 16:12 |
Re: js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
На msdn.microsoft.com сказано:
Цитата: Наверное, автор прав. |
Re: js - по ссылке или по значениею | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
По сути то же самое, но с явно описанным классом, не с Empty. Терминологическая проблема имеет место быть, да. "Передача по ссылке" это всё-же не "передача ссылки". И если объекты (в C# только reference types! т.е. уже НЕ ВСЕ объекты) передаются в методы путём "передачи ссылки", то "передача ПО ссылке" это несколько другое - да, это по сути передача "адреса указателя", или, точнее "указателя на указатель". Это странно... C# "строже" и требует писать ref И в декларации, И в точке вызова (при том сигнатура метода с параметром типа Type и с параметром типа ref Type совершенно чётко разделяется). Вот между ref Type и out Type разделения нету, и описать 2 метода где всё различие состоит только в том что в одном будет ref а в другом out - нельзя. Т.е. вообще-то конкретно в этом примере сделать методы с ОДНИМ именем (определить такую перегрузку метода setName) вполне допустимо. ------------------ WBR, Igor |
Re: js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
На самом деле, при передаче параметров в стек всегда что то сохраняется. Выходит, передать "по ссылке" нельзя - всё и всегда передаётся только "по значению", а передачи параметров "по ссылке" вообще не существует. Потому, вместо "ссылочные типы передаются по ссылке" будем говорить "для ссылочных типов 'по значению' передаётся значение ссылки"... Так? Мне кажется, под терминами "передача по значению" и "передача по ссылке" надо понимать, "в стек засунута переменная" и "в стек засунут адрес переменной". Передача "по ссылке" переменной ссылочного типа - это уже третье, это передача адреса ссылки - по большому счёту это довольно лишнее, можно даже сказать "на фиг не нужное". Даже если сделать методы с ОДИН именем (подкорректировал пример), сделать одну setName не получится - всё равно должно быть две функции setName. |
Re: js - по ссылке или по значениею | |
---|---|
Taran Сообщений: 13624 Откуда: Красноярск Дата регистрации: 16.01.2008 |
И это же замечательно. Читабельность функций легче, головняков меньше. И помнить два названия функции не надо. |
Re: js - по ссылке или по значениею | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Не все системы пользуются стеком, и даже если пользуются, то не всегда параметры передаются через стек. Я бы не стал вообще заострять внимание на "внутренней реализации" вызова и передачи параметра. Важна семантика - передаём КОПИЮ значения/переменной, либо же передаём САМО это значение/переменную (так что вызываемый код может изменить её, не просто "использовать"). Опять ты уходишь в дебри реализации... Не важно это всё, передаются всегда какие-то байтики - либо в стеке (процессорном, или "среды исполнения"), либо в регистрах, либо в какой-то специальной области памяти... Но то как всё работает "внутри" должно волновать системных программистов - тех кто пишет компиляторы/интерпретаторы или "рантаймы" (среды исполнения байт-кода). Для прикладного разработчика вполне достаточно понимания вышеприведенного примера - в одном случае поменяли переменную, в другом - нет (но поменяли нечто С ПОМОШЬЮ данных хранящихся в этой переменной). "если звезды зажигают - значит - это кому-нибудь нужно?" (c) Если метод должен создать новый объект для внешнего кода, то у него достаточно мало способов вернуть его наружу. Возвращаемое значение метода - но оно только одно (ну да, можно вернуть структуру/объект с полями/свойствами, в новых редакциях C# даже в автогенерируемый тип). Можно воспользоваться ref или out (по сути это разновидность ref не требующая наличия "начального значения" в передаваемой переменной). Так что вовсе это не "бесполезная фигня". Естественно, т.к. логика (код) должна быть разной у этих методов - и сигнатуры у них разные. Ну если вернуться к старому доброму Си, то int и int* это совершенно разные типы ------------------ WBR, Igor Исправлено 1 раз(а). Последнее : Igor Korolyov, 28.12.16 18:54 |
Re: js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Для меня "значение" и "переменная" это разные вещи. Переменная - это место (физически - ячейка памяти), где хранится какое то конкретное значение. "Передать копию значения [содержащегося в переменной]" - это то понятно. Это когда значение одной ячейки памяти записывают в другую ячейку памяти. "Передать копию переменной" - это то же самое, что "передать копию значения переменной". Тут всё понятно. Это - передача параметра "по значению" А что, что такое "передать САМО значение" и "передать САМУ переменную"? У ячейки памяти нельзя изменить её адрес. Выходит, физически нельзя передать "саму переменную". Можно только передать адрес ячейки памяти (указатель на переменную). А потом с помощью косвенной адресации обратиться по указанному адресу. Это и есть передача параметра "по ссылке". |
Re: js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Решил проверить - как же всё таки на С++ (именно со ссылкой, а не с указателем, как в С):
Теперь вот сижу, и думаю, почему после setName не вывелось "Nikolas"... |
Re: js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Выходит, в первом случае person передан "по значению" - целиком запихнут в стек. Другого объяснения придумать не могу.
|
Re: js - по ссылке или по значениею | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Передача указателя в явном виде (и так же в явном виде его разыменовывание).
Теперь, если вызвать setName3(&person); увидим "Greg". Исправлено 1 раз(а). Последнее : S-type, 30.12.16 13:29 |
Re: js - по ссылке или по значениею | |
---|---|
Рома Сообщений: 1079 Дата регистрации: 06.06.2001 |
С++ неявно объявил за тебя несколько членов (правило трех)
То есть в C++ передача по значению приводит к неявному вызову конструктора копии.
|
Re: js - по ссылке или по значениею | |
---|---|
Рома Сообщений: 1079 Дата регистрации: 06.06.2001 |
Ну так ссылка по сути и есть "безопасный указатель" В том смысле, что setName3(nullptr) рухнет по access violation, а setName2(nullptr) не даст сделать компилятор |
© 2000-2024 Fox Club  |