Конференция "Начинающим" » Передача параметра
 
  • VOsipov © (23.04.17 10:51) [0]
    Объясните пожалуйста, я не понимаю простых вещей.

    Если передать в процедуру MyProc(Str: String), то Str во внешней процедуре не меняется. Если так: MyProc(var Str: String), то Str - изменится. Это понятно.

    Но почему если передать в MyProc(MyLabel: TLabel) компонент, то все изменения в этой процедуры повлияют на него, ведь передаем же не так: MyProc(var MyLabel: TLabel) ??
  • Плохиш © (23.04.17 12:39) [1]
    MyLabel ссылка на экземпляр класса, переменную менять нельзя, но поля класса на который она указывает менять никто не запрещает.

    PS. В документации всё подробно описано.
  • Rouse_ © (23.04.17 12:41) [2]

    > Если передать в процедуру MyProc(Str: String), то Str во
    > внешней процедуре не меняется.

    Потому что передается копия строки.


    > Если так: MyProc(var Str: String), то Str - изменится.

    Потому что передается по ссылке, считай указатель на строку.

    А объект "MyLabel: TLabel" так-же является указателем, делай выводы.
  • VOsipov © (23.04.17 13:17) [3]

    > Rouse_ ©   (23.04.17 12:41) [2]


    Спасибо, но почему передается указатель на объект, а не копия объекта?
  • rrrrrr (23.04.17 14:48) [4]
    потому что он большой и не является непрерывным куском памяти в общем случае.
    попробуй передай еще
  • rrrrrr (23.04.17 14:51) [5]
    это если еще не вдаваться в смысл передачи копии объекта.
    точнее в полное отсутствие какого бы то ни было смысла такой передачи
  • Rouse_ © (23.04.17 21:22) [6]

    > VOsipov ©   (23.04.17 13:17) [3]
    >
    > > Rouse_ ©   (23.04.17 12:41) [2]
    >
    >
    > Спасибо, но почему передается указатель на объект, а не
    > копия объекта?

    Потому что это указатель, вот было бы MyProc(var MyLabel: TLabel), тогда был бы указатель на указатель
  • Игорь Шевченко © (23.04.17 21:43) [7]

    > почему передается указатель на объект, а не копия объекта?


    Так устроено. В книжках, опять же, все написано и даже с картинками.
  • Германн © (24.04.17 01:45) [8]

    > VOsipov ©   (23.04.17 13:17) [3]
    > Спасибо, но почему передается указатель на объект, а не
    > копия объекта?

    А нафига нужно в данном случае делать "копию объекта"? Хоть один разумный и достаточный довод попробуй придумать.
  • ухты © (24.04.17 04:57) [9]

    > Хоть один разумный и достаточный довод попробуй придумать.
    а какой "разумный и достаточный" при передачи, например, вещественного числа? и чем он "разумнее" нежели для объекта?
  • rrrrr © (24.04.17 08:31) [10]
    когда число, то нас интересует его значение. ничего другого у числа нет.
    оно и передается по значению. хотя можно и по ссылке.

    теперь попробуй скажи что такое "значение объекта"
  • Sha © (24.04.17 10:51) [11]
    1. С одной стороны, передача объекта без var может дать микроскопическое увеличение скорости и позволит защитить указатель от изменений, которые без надобности и так никто в здравом уме делать не будет.
    2. С другой стороны, в последствии замена объекта на record приведет к ошибке в работе программы.
    3. С третьей стороны, наличие var может ввести читателя в заблуждение.

    В общем, на мой взгляд, вопрос не такой однозначный как кажется.
  • Игорь Шевченко © (24.04.17 11:35) [12]
    Sha ©   (24.04.17 10:51) [11]


    > С другой стороны, в последствии замена объекта на record
    > приведет к ошибке в работе программы


    И правильно сделает. Мне крайне трудно представить себе серьезную программу, в которой бездумно меняют class на record и обратно, при этом забывая о всех последствиях такой замены.
    Вопрос однозначный - есть синтаксис языка, нравится он или не нравится, это  личные предпочтения каждого, но придерживаться синтаксиса стоит.
  • D7 (24.04.17 11:37) [13]
    > Спасибо, но почему передается указатель на объект, а не копия объекта?

    Вам как-то не так объяснили. Передаётся как раз копия.
    Вот только сам по себе TLabel это не объект, а указатель на объект. И передаётся копия значения TLabel. А значение TLabel это указатель.
  • Sha © (24.04.17 11:38) [14]
    > Игорь Шевченко ©   (24.04.17 11:35) [12]

    к сожалению, в последнее время мне часто приходится осмысленно менять class на record и обратно в серьезной программе, при этом не забывая о всех последствиях такой замены )
  • Игорь Шевченко © (24.04.17 11:44) [15]
    Sha ©   (24.04.17 11:38) [14]

    Вряд ли ты это делаешь бездумно :)
  • NoUser © (24.04.17 14:02) [16]
    > не понимаю простых вещей.

    Тут, наверное, многие их не понимают ;)

    В MyProc(Str: String), MyProc(const Str: String) и MyProc(var Str: String)

    строки передаются одинаково, а именно, как указатель на указатель (адрес по которому размещён адрес первого элемента строки).

    Разница в действиях с параметром Str определяется самой MyProc.

    Например, в  MyProc(Str: String) перед явным изменением Str, будет создан ёё дубликат, в котором и произойдут изменения.

    Такой внутренний 'механизм' используется для длинных строк и может ввести в заблуждение относительно поведения других типов данных в сходных условиях.

    ( > Но почему если передать в MyProc(MyLabel: TLabel) компонент, то все изменения в этой процедуры повлияют на него, ведь передаем же не так: MyProc(var MyLabel: TLabel) ?? )

    Для экземпляров объектного типа дублирования не характерно.

    Но мы сами можем прописать/выполнить необходимые для этого действия (создать новый и наполнить/скопировать в него нужные данные).

    Например для ситуации, если у нас есть объект-шаблон, на основании которого должны выполнить дальнейшие вычислении, не изменяя при этом сам шаблон.
  • ухты © (24.04.17 18:43) [17]

    > когда число, то нас интересует его значение. ничего другого
    > у числа нет.

    а у объекта кроме объекта еще что то есть?
    а реф по валуе тайпу это для красоты придуман?
  • rrrrrr © (24.04.17 19:20) [18]
    а у объекта кроме объекта еще что то есть?
    а реф по валуе тайпу это для красоты придуман?


    ты если собрался передать объект по значению,
    то сначала придумай что такое значение объекта.
    а уж потом со своей красотой умничай.
  • KSergey © (25.04.17 11:01) [19]
    > Германн ©   (24.04.17 01:45) [8]
    > А нафига нужно в данном случае делать "копию объекта"? Хоть один разумный и достаточный довод попробуй придумать.

    Полегче бы в формулировках, господа.

    Например, в С++ передаётся именно копия объекта, как и любые другие типы.
    Так что разумный довод - объекты ничем не хуже других типов.
    Но Дельфи устроена иначе, имеет право.
 
Конференция "Начинающим" » Передача параметра
Есть новые Нет новых   [118392   +1][b:0][p:0.001]