Ламерский вопрос по Сям: тип возвращаемого значения int&

Тема в разделе "WASM.BEGINNERS", создана пользователем ubil, 8 дек 2006.

  1. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Открыл одну книгу и наткнулся на вещь, с которой встречался еще пару лет назад, но так и не разобрался, буду рад если вы мне поможете наконец это сделать.
    Допустим есть функция f:
    ....
    int z = 1;
    int k;
    ....
    int& f()
    {
    return z;
    }
    ....
    k = f(z);
    ....
    Какой смысл такой записи если без "&" эффект такой же? В приведенном случае функция выдает адрес, а потом уже вне функции k будет присвоено значение по полученному адресу. А если убрать "&", то обращение по адресу z будет происходить внутри функции, вне функции только k присвоится полученное значение. Вопрос мой: зачем такое на вид совсем несущественное различие нужно? Могу предположить только разве что для того, чтобы можно было бы удобно возвращать объекты из функций, чтобы не мучаться например с кучей строк вида a.x = p->x;...
     
  2. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    Имхо в данном случае (с int) разницы нет
    а если нужно вернуть структуру или класс то возвращется только адресс а это быстрее и проще
     
  3. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    раза три пробовал читать последний абзац, запутался.. виды, объекты какие-то..
    Код (Text):
    1. зачем такое на вид совсем несущественное различие нужно?
    различие как между реальной квартирой и адресом от нё, представь себе у тебя есть адрес от квартиры где денги лежат, а ключа (прав) нима, и что? что-то облом
    в твоём случае получается одинаково только потому что инт и &инт, суть одно (ДВОРД, в 32 разрядной платформе)
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    This works too:
    Код (Text):
    1. f() = 25;
    Only functions returning a ref. can do that!
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Такое лучше делать для больших значений pod-типов (структур), классов (чтобы не вызывался конструктор копирования, часто это накладно) и операторов типа []:
    Код (Text):
    1. class C{
    2. ...
    3.  buff_t& operator[](int& index)
    4.  {
    5.    return buff[index];
    6.  }
    7. };
    Несмотря на то, что здесь вроде бы значение только возвращается, это будет работать и так: c[12] = 0;
    Так как реально на машинном коде будет что-то вроде *c.operator[](12) = 0;
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    AsmGuru62
    А интересно практическое значение такого `works`?
     
  7. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    ОК. Спасибо всем! примерно как я и предполагал с самого начала:)
    А в случае "c[12] = 0;", получается, только с помощью этого амперсанда возможно корректно определить оператор []?
    А еще, тут упоменули структуры... Но у них же может быть не определен оператор "=" тогда код

    strct = f();, по идее, не должен работать?
     
  8. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    IceStudent
    Я использовал такой финт для доступа в N-мерный динамический массив:
    Код (Text):
    1. double& DataCube::Cell (int iDim1, int iDim2, int iDim3)
    2. {
    3.     return /* reference to specified double value... */  ;
    4. }
    Конечно можно сделать обычные функции доступа в классе DataCube: GetValue() и SetValue(). Но так вроде нагляднее.

    Кроме того: две функции доступа будут иметь совершенно одинаковый код для расчёта нужного смещения - не хочется делать двойную работу. Если использовать для таких расчётов функцию - только если её можно сделать inline - а если не получается? Тогда код будет медленнее. У нас в DataCube иногда миллион или два значений - и эта функция должна быть оптимизирована до предела.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Имхо, да. Иначе будет работать только в режиме read-only (значение ведь устанавливается через указатель).

    Структуры - pod-данные и по умолчанию копируются побайтно. Впрочем, как и классы, если иное не определено в самом классе.

    AsmGuru62
    Понятно. По сути - свойство.
     
  10. Sharp

    Sharp New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    143
    Адрес:
    Ukraine
    Стоит отметить, что обычно желательно определять два разных оператора для подобных случаев, например:
    T& operator [] (Y index);
    и T operator [] (Y index) const;
    Тогда первый будет использоваться для l-value, а второй - для r-value.
     
  11. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    для больших объектов луше в конст функции возвращать ссылку на константу - не будет вызван конструктор копирования

    const T& operator [] (Y index) const;