Открыл одну книгу и наткнулся на вещь, с которой встречался еще пару лет назад, но так и не разобрался, буду рад если вы мне поможете наконец это сделать. Допустим есть функция f: .... int z = 1; int k; .... int& f() { return z; } .... k = f(z); .... Какой смысл такой записи если без "&" эффект такой же? В приведенном случае функция выдает адрес, а потом уже вне функции k будет присвоено значение по полученному адресу. А если убрать "&", то обращение по адресу z будет происходить внутри функции, вне функции только k присвоится полученное значение. Вопрос мой: зачем такое на вид совсем несущественное различие нужно? Могу предположить только разве что для того, чтобы можно было бы удобно возвращать объекты из функций, чтобы не мучаться например с кучей строк вида a.x = p->x;...
Имхо в данном случае (с int) разницы нет а если нужно вернуть структуру или класс то возвращется только адресс а это быстрее и проще
раза три пробовал читать последний абзац, запутался.. виды, объекты какие-то.. Код (Text): зачем такое на вид совсем несущественное различие нужно? различие как между реальной квартирой и адресом от нё, представь себе у тебя есть адрес от квартиры где денги лежат, а ключа (прав) нима, и что? что-то облом в твоём случае получается одинаково только потому что инт и &инт, суть одно (ДВОРД, в 32 разрядной платформе)
Такое лучше делать для больших значений pod-типов (структур), классов (чтобы не вызывался конструктор копирования, часто это накладно) и операторов типа []: Код (Text): class C{ ... buff_t& operator[](int& index) { return buff[index]; } }; Несмотря на то, что здесь вроде бы значение только возвращается, это будет работать и так: c[12] = 0; Так как реально на машинном коде будет что-то вроде *c.operator[](12) = 0;
ОК. Спасибо всем! примерно как я и предполагал с самого начала А в случае "c[12] = 0;", получается, только с помощью этого амперсанда возможно корректно определить оператор []? А еще, тут упоменули структуры... Но у них же может быть не определен оператор "=" тогда код strct = f();, по идее, не должен работать?
IceStudent Я использовал такой финт для доступа в N-мерный динамический массив: Код (Text): double& DataCube::Cell (int iDim1, int iDim2, int iDim3) { return /* reference to specified double value... */ ; } Конечно можно сделать обычные функции доступа в классе DataCube: GetValue() и SetValue(). Но так вроде нагляднее. Кроме того: две функции доступа будут иметь совершенно одинаковый код для расчёта нужного смещения - не хочется делать двойную работу. Если использовать для таких расчётов функцию - только если её можно сделать inline - а если не получается? Тогда код будет медленнее. У нас в DataCube иногда миллион или два значений - и эта функция должна быть оптимизирована до предела.
Имхо, да. Иначе будет работать только в режиме read-only (значение ведь устанавливается через указатель). Структуры - pod-данные и по умолчанию копируются побайтно. Впрочем, как и классы, если иное не определено в самом классе. AsmGuru62 Понятно. По сути - свойство.
Стоит отметить, что обычно желательно определять два разных оператора для подобных случаев, например: T& operator [] (Y index); и T operator [] (Y index) const; Тогда первый будет использоваться для l-value, а второй - для r-value.
для больших объектов луше в конст функции возвращать ссылку на константу - не будет вызван конструктор копирования const T& operator [] (Y index) const;