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

Что передаётся в функцию, если в прототипе ссылка? - C++

Восстановить пароль Регистрация
 
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
04.12.2012, 20:02     Что передаётся в функцию, если в прототипе ссылка? #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void swap(int &, int &);
 
int main()
{
       /* ... */
       swap(x,y);
       /* ... */
}
 
void swap(int &rx, int &ry)
{
       /* ... */
}
Такой коментарий к коду: "В строке 6 расположен вызов функции swap(), но ей передаются именно значения x и y, а не их адреса. Вызывающая функция просто передаёт свои переменные."

Что-то я не понял. Читал недавно здесь, на форуме, что при передаче с использованием указателей или ссылок, в обоих случаях передаются адреса реальных переменных из функции main:
Ссылки и указатели
(см. страница 1, сообщения обоих модераторов).

Кто не прав? Книжка, поди, опять... Снова меня запутали.

(Или может автор книги хотел сказать, что вызов функции swap в данном случае такой же, как если бы была передача по значению? А конкретная реализация функции swap скрыта от функции main. - это я сейчас просто фантазирую).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2012, 20:02     Что передаётся в функцию, если в прототипе ссылка?
Посмотрите здесь:

C++ Создать функцию, которой строка передаётся как параметр, и которая возвращает количество слов
Создать функцию, которой строка передаётся как параметр, и которая возвращает количество слов C++
C++ Инкапсуляция, ссылка на функцию
C++ Переменная ссылочного типа в прототипе функции
C++ Строка не передаётся в функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
booker
 Аватар для booker
23 / 23 / 2
Регистрация: 21.11.2012
Сообщений: 106
04.12.2012, 20:08     Что передаётся в функцию, если в прототипе ссылка? #2
Да адреса вроде
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:10     Что передаётся в функцию, если в прототипе ссылка? #3
Цитата Сообщение от Alex Z Посмотреть сообщение
Кто не прав? Книжка, поди, опять... Снова меня запутали.
считайте, что передается сам объект, не забивайте себе голову такими вопросами до поры до времени.
freemanc
 Аватар для freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
04.12.2012, 20:10     Что передаётся в функцию, если в прототипе ссылка? #4
при передаче с использованием указателей или ссылок, в обоих случаях передаются адреса реальных переменных из функции main
- все верно, функция получает переменную по ссылке
Igor3D
792 / 409 / 33
Регистрация: 01.10.2012
Сообщений: 2,066
04.12.2012, 20:13     Что передаётся в функцию, если в прототипе ссылка? #5
Цитата Сообщение от Alex Z Посмотреть сообщение
C++
1
2
3
4
5
void swap(int &, int &);
void swap(int &rx, int &ry)
{
       /* ... */
}
Такой коментарий к коду: "В строке 6 расположен вызов функции swap(), но ей передаются именно значения x и y, а не их адреса. Вызывающая функция просто передаёт свои переменные."
Не знаю что хотел сказать автор комментариев, но верить ему не следует Физически передаются адреса, просто с ними работают как с переменными (а не как с указателями). Это называется вумным словом "семантика"
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:15     Что передаётся в функцию, если в прототипе ссылка? #6
Цитата Сообщение от freemanc Посмотреть сообщение
все верно, функция получает переменную по ссылке
Это понятие языков более высокого уровня.
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.12.2012, 20:15     Что передаётся в функцию, если в прототипе ссылка? #7
Ссылки, как и указатели в аргументах функции всегда принимают адреса

З.Ы.
это
C++
1
2
3
4
5
6
7
void swap (int* x, int* y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
эквивалентно
C++
1
2
3
4
5
6
7
void swap (int& x, int& y)
{
int temp;
temp = x;
x = y;
y = temp;
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:17     Что передаётся в функцию, если в прототипе ссылка? #8
Цитата Сообщение от coloc Посмотреть сообщение
эквивалентно
попробуйте swap(NULL,NULL) сделать в примере с ссылками.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
04.12.2012, 20:18     Что передаётся в функцию, если в прототипе ссылка? #9
вот такая функция
C++
1
2
3
4
5
6
void swap(int &rx, int &ry)
{
int tmp=rx;
rx=ry;
ry=rx;
}
поменяет значения между собой
а такая
C++
1
2
3
4
5
6
void swap(int rx, int ry)
{
int tmp=rx;
rx=ry;
ry=rx;
}
поменяет копии значений

но вызов этих функций одинаков(синтаксически)
C++
1
swap(x,y);
если тебя интересуют такие тонкости то дизасемблируй коды и смотри в чем разница
Igor3D
792 / 409 / 33
Регистрация: 01.10.2012
Сообщений: 2,066
04.12.2012, 20:21     Что передаётся в функцию, если в прототипе ссылка? #10
Цитата Сообщение от Croessmah Посмотреть сообщение
попробуйте swap(NULL,NULL) сделать в примере с ссылками.
А почему нет?
C++
1
swap(*(int *) NULL, *(int *) NULL);
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:23     Что передаётся в функцию, если в прототипе ссылка? #11
Цитата Сообщение от Igor3D Посмотреть сообщение
А почему нет?
это уже другое.
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.12.2012, 20:26     Что передаётся в функцию, если в прототипе ссылка? #12
Croessmah, тоесть ссылки не могут указывать в никуда? Компилятора просто сейчас нету
ЗЫ А как это - указатель в никуда? (тоесть NULL?) Куда он начинает указывать при инициализации?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:27     Что передаётся в функцию, если в прототипе ссылка? #13
Ссылки - это целый механизм и сравнивать его с указателями как-то не хорошо. Как это реализуется на низком уровне - можно узнать, посмотрев код на мнемонике ассемблера.
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.12.2012, 20:30     Что передаётся в функцию, если в прототипе ссылка? #14
Мда... Я осознал , что я чайник в еще большей степени, чем есть
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:30     Что передаётся в функцию, если в прототипе ссылка? #15
Цитата Сообщение от coloc Посмотреть сообщение
Croessmah, тоесть ссылки не могут указывать в никуда? Компилятора просто сейчас нету
ЗЫ А как это - указатель в никуда? (тоесть NULL?) Куда он начинает указывать при инициализации?
Это я к тому, что ссылки контролируются еще и компилятором, в отличии от указателей.
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
04.12.2012, 20:36     Что передаётся в функцию, если в прототипе ссылка? #16
С точки зрения низкого уровня - версии со ссылками и указателями - одинаковы. VS2012, оптимизация отключена.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
 
void ref_swap(int& a, int& b)
{
    int tmp = a;
    a = b;
    b=tmp;
}
 
void p_swap(int *a, int *b)
{
    int tmp = *a;
    *a=*b;
    *b=tmp;
}
 
int main()
{
    int a = 0, b = 0;
    cout<<"Enter a: "; cin>>a;
    cout<<"Enter b: "; cin>>b;
    ref_swap(a, b);
    cout<<"a == "<<a<<"\nb == "<<b<<endl;
    p_swap(&a, &b);
    cout<<"a == "<<a<<"\nb == "<<b<<endl;
}
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
;   COMDAT ?ref_swap@@YAXAAH0@Z
_TEXT   SEGMENT
_tmp$ = -4                      ; size = 4
_a$ = 8                         ; size = 4
_b$ = 12                        ; size = 4
?ref_swap@@YAXAAH0@Z PROC               ; ref_swap, COMDAT
 
; 5    : {
 
    push    ebp
    mov ebp, esp
    push    ecx
 
; 6    :    int tmp = a;
 
    mov eax, DWORD PTR _a$[ebp]
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR _tmp$[ebp], ecx
 
; 7    :    a = b;
 
    mov edx, DWORD PTR _a$[ebp]
    mov eax, DWORD PTR _b$[ebp]
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR [edx], ecx
 
; 8    :    b=tmp;
 
    mov edx, DWORD PTR _b$[ebp]
    mov eax, DWORD PTR _tmp$[ebp]
    mov DWORD PTR [edx], eax
 
; 9    : }
 
    mov esp, ebp
    pop ebp
    ret 0
?ref_swap@@YAXAAH0@Z ENDP               ; ref_swap
_TEXT   ENDS


Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
;   COMDAT ?p_swap@@YAXPAH0@Z
_TEXT   SEGMENT
_tmp$ = -4                      ; size = 4
_a$ = 8                         ; size = 4
_b$ = 12                        ; size = 4
?p_swap@@YAXPAH0@Z PROC                 ; p_swap, COMDAT
 
; 12   : {
 
    push    ebp
    mov ebp, esp
    push    ecx
 
; 13   :    int tmp = *a;
 
    mov eax, DWORD PTR _a$[ebp]
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR _tmp$[ebp], ecx
 
; 14   :    *a=*b;
 
    mov edx, DWORD PTR _a$[ebp]
    mov eax, DWORD PTR _b$[ebp]
    mov ecx, DWORD PTR [eax]
    mov DWORD PTR [edx], ecx
 
; 15   :    *b=tmp;
 
    mov edx, DWORD PTR _b$[ebp]
    mov eax, DWORD PTR _tmp$[ebp]
    mov DWORD PTR [edx], eax
 
; 16   : }
 
    mov esp, ebp
    pop ebp
    ret 0
?p_swap@@YAXPAH0@Z ENDP                 ; p_swap
_TEXT   ENDS


Вызов этих функций - также 1 в 1.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2012, 20:43     Что передаётся в функцию, если в прототипе ссылка?
Еще ссылки по теме:

C++ Имена аргументов в прототипе функции
Что значит void в прототипе? C++
C++ В функцию через указатель передаётся массив ТОЛЬКО с первым[0] элементом

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:43     Что передаётся в функцию, если в прототипе ссылка? #17
Стефан К. Дьюхэрст - Скользкие места С++
там есть полезности по этому вопросу.
Yandex
Объявления
04.12.2012, 20:43     Что передаётся в функцию, если в прототипе ссылка?
Ответ Создать тему
Опции темы

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