2013-03-01 2 views
-4

Извините, если вопрос очень прост.Возврат по ссылке

ПРОГРАММА 1:

#include <iostream> 
using namespace std; 

int max(int &a) 
{ 
    a +=100; 
    return a; 
} 

int main (int argc, char ** argv) 
{ 

    int x=20; 
    int y; 
    y = max(x); 
    cout <<"x , y value is "<<x<<"and"<<y<<endl; 
} 

ВЫХОД:

х, у значение 120and120

ПРОГРАММА 2:

#include <iostream> 
using namespace std; 

int & max(int &a) 
{ 
    a +=100; 
    return a; 
} 

int main (int argc, char ** argv) 
{ 

    int x=20; 
    int y; 
    y = max(x); 
    cout <<"x , y value is "<<x<<"and"<<y<<endl; 
} 

ВЫХОД:

х, у значение 120and120

Единственное различие между PROGRAM1 и PROGRAM2 является то, что второй возвращает программу путем ссылки. В чем же разница?

+8

Я не вижу разницы в коде или выходе ... –

+1

Я думаю, что вы сделали ошибку для копирования-вставки, обе программы одинаковы. –

+0

Нет, нет разницы в двух фрагментах кода вообще. – 2013-03-01 14:24:46

ответ

0

У двух программ нет проблем. Проблема возникает только тогда, когда вы возвращаете по ссылке локальную переменную для этой функции. Это связано с тем, что эта ссылка исчезнет в конце функции. Но поскольку вы используете a, он будет по-прежнему находиться в области действия после вызова функции.

0

Как я понимаю, при возврате по значению создается новая переменная, возвращаемая по ссылке возвращает ссылку на исходную переменную, что позволяет сэкономить выделение памяти.

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

+0

При возвращении по ссылке возникает вопрос: «Когда эта возвращаемая переменная перестает существовать?» –

1

PROGRAM1: копирует ссылки переменной а при возвращении, что
PROGRAM2: (? Той же ссылке, на самом деле) возвращает ссылку на самой ссылочной переменной.

Будет нет разницы в выходе, так как значение копируется в переменную 'y' в любом случае.

Однако PROGRAM1 выполняет еще одну операцию копирования, а не PROGRAM2.

Проблема происходит когда вы любите:

int& max(int a) // a is value variable 
{ 
    a +=100; 
    int &a1 = a 
    return a1; // you are returning reference to local 
} 

Здесь В этой версии max() переменной a объем локальна макс(), и если ваше возвращение ссылки на a. тогда выделение в стеке будет уходить, и вы ничего не имеете в виду. Неправильно!

чтения для более explanation here

+0

Добавлена ​​дополнительная информация в вашем ответе. если вам не нравится возвращаться назад. –

0

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

Итак, если вы работали с другим большим типом, который был заполнен полями вместо int, было бы лучше использовать второй.

0

Единственная разница в ваших двух программ, где значение x копируется из x в другое место [и фактический код, он, вероятно, на самом деле не имеет никакого значения вообще, потому что компилятор оптимизирует расстояние «необязательная» копия].

В вашей первой функции, a является псевдонимом для x в основном, и она будет скопирован, когда return a; в возвращаемом значение для функции [в x86, который был бы eax регистра, для всех вариантов компиляторов Я знаю, как они работают]. Поэтому мы возвращаем копию значения в x.

Во втором примере, то же сглаживание в x применяется, но мы возвращаем «псевдоним», в сущности, код может быть принято читать:

int y; 
    max(x); 
    y = x; 

Это действительно не имеет значения для целей этого кода, но если вы должны были иметь soemthing так:

int &max(int &x, int &x) 
{ 
    if (x > y) return x; 
    return y; 
} 


int main() 
{ 
    int a = 10; 
    int b = 13; 

    int& c = max(a, b); 

    c = 12; 

    cout << "a=" << a << " b=" << b << " c=" << c; 
} 

Теперь мы должны увидеть b быть дано значение 12, поскольку c становится псевдонимом b.

+0

Спасибо Маты, просто вы объяснили, что за это. – Whoami

0

Насколько я могу судить, обе программы в точности одинаковы. Вы не скопировали правильный код? В общем случае, когда вы передаете переменную по ссылке, вы вносите изменения в исходную переменную. Когда вы передаете его по значению, вы передаете копию переменной. Это означает, что если вы передадите переменную по ссылке и внесете ее, исходная переменная также будет изменена. Это не так, когда вы переходите по значению.

+0

Они точно подобны, кроме программы 2 имеет тип возврата 'int &' по сравнению с 'int' программы 1. – LlamaCloud

Смежные вопросы