Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
#1

Функция - принять ссылку вернуть ссылку - C++

28.07.2013, 13:18. Просмотров 756. Ответов 6
Метки нет (Все метки)

В одной из тем я интересовался записью типа int & fun (int rhs), что она значит и что именно в ней делает символ &, как я понял, программа типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream> 
 
int & fun (int rhs)
{ return rhs; }
 
int main()
{
int var = 2;
var  = fun(var );
 
system("pause");
return 0;
}
var имеет свой адрес в памяти, например 30000, мы передаем значение var в функцию, где оно копируется и получает новое имя rhs, и соответственно rhs имеет свой адрес в памяти, например 40000, а строчка 4 возвращает ссылку на адрес в памяти 40000, который уже был уничтожен (этот адрес уже не имеет отношения к данной программе), что вызывает ошибки т.д.

Подскажите, а если я делаю такую запись:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream> 
 
int & fun (int &rhs)
{ return rhs; }
 
int main()
{
int var = 2;
var = fun(var);
 
system("pause");
return 0;
}
var имеет адрес в памяти 30000, я соответственно в функцию передаю уже не копию, а ссылку на адрес 30000, и возвращаю опять же ссылку на адрес 30000, который существует, не был уничтожен, т.е. данная запись работает полностью корректно.

И возвращение ссылки работает только в виде такой записи - int & fun (int &rhs) - принял ссылку, вернул ссылку.

Правильно ли я все понимаю? или бывает еще как то.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2013, 13:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция - принять ссылку вернуть ссылку (C++):

Принять ссылку и массив - C++
Есть массив int x = new int Как создать функцию, которая сможет получить ссылку на массив и вернуть новый массив ? Например для...

Как вернуть ссылку на объект? - C++
Вот код из книжки А.Крупника &quot;Изучаем С++&quot; char suits = {'','—','','’'}; char cds = {'6','7','8','9','A','‚','„','Š','’'}; ...

Возможно ли вернуть из функции ссылку на массив - C++
Чисто из интереса появился такой вопрос. Если в функцию можно передать массив по ссылке: void print(int (&amp;arr)) { ...

Вычислить минимальный элемент массива и вернуть ссылку на него - C++
Найти сумму положительных элементов массива из N элементов, расположенных до первого нулевого элемента.(используя ссылочную переменную) ...

Подскажите как мне из класса вернуть ссылку на класс - C++
Вот допустим у меня есть класс void OnPlayerShooted(int playerid); class PLAYER { public: int shoot() { ...

Как вернуть из функции ссылку на статически создаваемый двумерный массив? - C++
foo(...){ static int Arr return Arr; } int ((foo)(const int m)) //Неверно

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
28.07.2013, 13:52 #2
return *rhs;
1
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.07.2013, 14:21 #3
Цитата Сообщение от VLK Посмотреть сообщение
Правильно ли я все понимаю?
правильно

Цитата Сообщение от VLK Посмотреть сообщение
И возвращение ссылки работает только в виде такой записи - int & fun (int &rhs) - принял ссылку, вернул ссылку.
нет, не только в таком виде
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6467 / 3115 / 306
Регистрация: 04.12.2011
Сообщений: 8,590
Записей в блоге: 4
28.07.2013, 16:31 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream> 
 using namespace std;
int & fun (int &rhs)//тут ничего не создается и не копируется
{
    rhs++;
cout<<&rhs<<endl;//это "внешний" адрес, то есть адрес в вызывающей функции  
    return rhs; 
}
 
int main()
{
int var = 2;
cout<<&var<<endl;//это адрес по которому переменная (не копия) передается в fun
var = fun(var);
 cout<<var<<endl;
 cout<<&var<<endl;//адрес не изменился
system("pause");
return 0;
}


Добавлено через 40 минут
Извините VLK, я не вчитался в топик и запостил зря.
Ссылку на локальную переменную возвращать нельзя, но запись может быть и другой.
Цитата Сообщение от VLK Посмотреть сообщение
И возвращение ссылки работает только в виде такой записи - int & fun (int &rhs) - принял ссылку, вернул ссылку.
Можно, например возвращать ссылку на статическую переменную, объявленную в функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
using namespace std;
int & fun ()//тут ничего не передаётся
{
static int  ist=1;
ist++;
return ist; 
}
 
int main()
{
cout<<fun()<<endl;
cout<<fun()<<endl;
cout<<fun()<<endl;
fun()=123;// :)
cout<<fun()<<endl;
cout<<fun()<<endl;
cout<<fun()<<endl;
system("pause");
return 0;
}
1
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
28.07.2013, 16:39  [ТС] #5
Я как то интересовался всем "набором" символов в функции - Передача в функцию - ссылки, указатели, константы Передача в функцию - ссылки, указатели, константы

и как понял запись типа int & fun (int rhs) приводит к ошибке, программа работает, но..

При этом довольно часто в книге встречаются записи типа: str & operator= (const str & rhs)

Вот и возник данный вопрос.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6467 / 3115 / 306
Регистрация: 04.12.2011
Сообщений: 8,590
Записей в блоге: 4
28.07.2013, 17:24 #6
Цитата Сообщение от VLK Посмотреть сообщение
Вот и возник данный вопрос.
Понятно.
Цитата Сообщение от VLK Посмотреть сообщение
как понял запись типа int & fun (int rhs) приводит к ошибке
здесь int rhs - объявление "внутренней" для fun переменной, с выделением памяти на её области стека ( в её области видимости). То есть создаётся локальная копия внешней переменной. Вы всё правильно поняли.
А в записи int & fun (int& rhs)
int& rhs - тоже объявление "внутренней" для fun переменной, но ссылки, которая инициализируется внешней ссылкой, то есть без выделения памяти на её области стека. Переменная на которую ссылается rhs созлана и живёт вне fun и при выходе из неё не разрушается. Разрушается ссылка, но в момент возврата она инициализирует принимающую переменную, по значению или адресу, - не имеет значения. Поэтому это работает правильно.
1
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.07.2013, 02:26 #7
Зачем здесь делать возврат ссылки? Что это даёт?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream> 
 
int & fun (int &rhs)
{ return rhs; }
 
int main()
{
int var = 2;
var = fun(var);
 
system("pause");
return 0;
}
Если можно просто:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream> 
 
void fun (int &rhs)
{ rhs += 2; }
 
int main()
{
int var = 2;
fun(var);
cout << var; // var == 4 
 
system("pause");
return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2013, 02:26
Привет! Вот еще темы с ответами:

Функция возвращающая ссылку - C++
Так делать не правильно, но попытался написать код: int&amp; func(int &amp;x) { return &amp;x; } В чем ошибка?

Функция, возвращающая ссылку - C++
Помогите исправить функцию, которая возвращает ссылку на массив size_t Crd() { size_t crd; return &amp;crd; }

Как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С - C++
Всем привет, как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С ? class A { public: A(); ...

Функция, возвращающая ссылку на static - C++
Задание такое: написать функцию f1,которая содержит локальную статическую переменную k,возводит ее в квадрат и возвращает ссылку на эту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.07.2013, 02:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru