2016-04-06 1 views
-1

Я и мой друг пытались выполнить две программы: сначала, где int &, а второй, где передается int &.Проверяет ли тип проверки на возврат и когда он передан как аргумент

Программа 1:

#include<iostream> 
using namespace std; 
int& fun(int x) 
{ 
    static int y=x; 
    cout<<"Inside Fun()"<<y<<endl; 
    return y; 
} 
int main() 
{ 
    cout<<(fun(10)=30)<<endl; 
    cout<<fun(40)<<endl; 
    return 0; 
} 

работает как шарм ..

В то время как программа 2

#include<iostream> 
using namespace std; 
int& fun(int &x) 
{ 
    static int y=x; 
    cout<<"Inside Fun()"<<y<<endl; 
    return y; 
} 
int main() 
{ 
    cout<<(fun(10)=30)<<endl; 
    cout<<fun(40)<<endl; 
    return 0; 
} 

дает ошибку

return.cc: In function 'int main()': 
return.cc:11: error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int' 
return.cc:3: error: in passing argument 1 of 'int& fun(int&)' 
return.cc:12: error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int' 
return.cc:3: error: in passing argument 1 of 'int& fun(int&)' 

В первой программе, весело :: & x = 30 разрешено взамен. В то время как в Программе 2 int & x = 10 не допускается. Мое сомнение заключается в том, выполняется ли более строгая проверка типов в C++ для параметров функции по сравнению с типами возврата и почему & x = 10 недействителен в качестве параметра функции.

+3

Код, который вы опубликовали, отличается от кода, который вы описали, который отличается от кода, создавшего эти ошибки. – erip

+0

Извините .. мой плохой. исправит его – CVS

+0

@AlexeyAndronov ничего себе. это похоже работа ..Но было бы неплохо, если бы вы могли объяснить мне разницу в обоих случаях и почему const был необходим как параметр, и то же самое не нужно для возвращаемого типа? – CVS

ответ

1

Вы не можете преобразовать 10 в int &, потому что это буквальное значение. Это не имеет никакого отношения к типу возврата, его фундаментальному недостатку в вашем понимании параметра. Вы можете сделать параметр a const int &, а затем это сработает.

+0

Но то же самое происходит, когда int & возвращается. Он присваивает значение для возврата x, параметр const не требуется? Почему это различие. – CVS

+0

Простите, @CVS Я не понимаю, что вы пытаетесь сказать. Ни одна из ваших программ не возвращает x; Я запустил код для программы 2 и после смены его на const int и он отлично работает. Пожалуйста, вы можете показать мне код, что вы имеете в виду? –

+1

Извините за путаницу .. Я пытаюсь спросить, в первой программе, когда вызывается fun (10) = 30, она фактически присваивает значение 30 статической переменной y способом fun :: y = 30, потому что int & is тип возврата. Почему эта константа не нужна на данный момент. Разве это не означает, что переход 10 к параметру x в func (int & x) – CVS

1

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

+0

Мой вопрос был, когда сделано fun() = 30, мы также присваиваем значение ссылке на х, которая возвращается .. В чем разница между передачей и возвратом. Оба мне нравятся. – CVS

+0

Когда вы набираете 'fun() = 30', вы не назначаете ссылку, вы присваиваете значение переменной, на которую ссылаются. В вашем случае это 'static int y'. – isapego

3

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

Если вы хотите ссылку и привяжите ее к временному или буквальному значению, вам необходимо использовать ссылку на константу , то есть int const&.

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

Например:

int val = 10; 
int& ref = fun(val); 

В приведенном выше коде, переменная ref на самом деле ссылка на статической локальной переменной y внутри функции fun.

+0

Теперь я понимаю этот момент. Когда возвращение выполняется как int &, такое же действие выполняется как передающее параметр, не так ли. Исправьте меня, если я ошибаюсь. Почему const не нужен? – CVS

+0

Означает ли это, если я использую fun (static int x), то можно избежать ошибки во второй программе? – CVS

+0

@CVS Нет, у вас не может быть статических аргументов. Во второй программе вам нужно 'int & fun (int const & x)' –

0

Передача по значению создаст копию переданного объекта с ожиданием того, что эта копия умрет в конце вызова функции.

Передача по ссылке передаст фактический объект, и вам будет разрешено его мутировать. Поскольку вы передаете литерал (10), вы не можете его мутировать, поэтому вам необходимо передать ссылку const.

+0

Спасибо за объяснение .. Почему то же самое не относится к типу возврата, когда int &. на самом деле, когда я делаю, fun() = 30, он фактически присваивает значение 30 x из-за возвращаемого типа int &. Здесь const не требуется? Это меня смущает. – CVS

+0

Я стараюсь не возвращать ссылки, потому что это может быть опасно. Если вы вернете ссылку на локальную переменную функции, вы вернете ссылку на объект, который был уничтожен (т. Е. Оборванная ссылка). Причина, по которой он работает в вашем случае, состоит в том, что 'y' объявлен' static', и как таковой будет работать до тех пор, пока программа. – erip

+0

Спасибо erip для объяснения. Я больше беспокоился о том, что const будет передан в качестве аргумента, а не при возврате. Почему это различие существует. – CVS

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