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

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

Восстановить пароль Регистрация
 
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.07.2013, 13:18     Функция - принять ссылку вернуть ссылку #1
В одной из тем я интересовался записью типа 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) - принял ссылку, вернул ссылку.

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

Цитата Сообщение от VLK Посмотреть сообщение
И возвращение ссылки работает только в виде такой записи - int & fun (int &rhs) - принял ссылку, вернул ссылку.
нет, не только в таком виде
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
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;
}
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
28.07.2013, 16:39  [ТС]     Функция - принять ссылку вернуть ссылку #5
Я как то интересовался всем "набором" символов в функции - Передача в функцию - ссылки, указатели, константы Передача в функцию - ссылки, указатели, константы

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

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

Вот и возник данный вопрос.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
28.07.2013, 17:24     Функция - принять ссылку вернуть ссылку #6
Цитата Сообщение от VLK Посмотреть сообщение
Вот и возник данный вопрос.
Понятно.
Цитата Сообщение от VLK Посмотреть сообщение
как понял запись типа int & fun (int rhs) приводит к ошибке
здесь int rhs - объявление "внутренней" для fun переменной, с выделением памяти на её области стека ( в её области видимости). То есть создаётся локальная копия внешней переменной. Вы всё правильно поняли.
А в записи int & fun (int& rhs)
int& rhs - тоже объявление "внутренней" для fun переменной, но ссылки, которая инициализируется внешней ссылкой, то есть без выделения памяти на её области стека. Переменная на которую ссылается rhs созлана и живёт вне fun и при выходе из неё не разрушается. Разрушается ссылка, но в момент возврата она инициализирует принимающую переменную, по значению или адресу, - не имеет значения. Поэтому это работает правильно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2013, 02:26     Функция - принять ссылку вернуть ссылку
Еще ссылки по теме:

C++ Как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С
C++ Функция, возвращающая ссылку на вектор
C++ Как вернуть ссылку на объект?

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 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;
}
Yandex
Объявления
29.07.2013, 02:26     Функция - принять ссылку вернуть ссылку
Ответ Создать тему
Опции темы

Текущее время: 18:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru