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

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

Войти
Регистрация
Восстановить пароль
 
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
#1

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

04.12.2012, 20:02. Просмотров 566. Ответов 16
Метки нет (Все метки)

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++
Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? C++
C++ Инкапсуляция, ссылка на функцию
C++ Переменная ссылочного типа в прототипе функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
booker
23 / 23 / 2
Регистрация: 21.11.2012
Сообщений: 106
04.12.2012, 20:08     Что передаётся в функцию, если в прототипе ссылка? #2
Да адреса вроде
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,937
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:10     Что передаётся в функцию, если в прототипе ссылка? #3
Цитата Сообщение от Alex Z Посмотреть сообщение
Кто не прав? Книжка, поди, опять... Снова меня запутали.
считайте, что передается сам объект, не забивайте себе голову такими вопросами до поры до времени.
freemanc
12 / 12 / 1
Регистрация: 27.11.2012
Сообщений: 140
04.12.2012, 20:10     Что передаётся в функцию, если в прототипе ссылка? #4
при передаче с использованием указателей или ссылок, в обоих случаях передаются адреса реальных переменных из функции main
- все верно, функция получает переменную по ссылке
Igor3D
903 / 458 / 40
Регистрация: 01.10.2012
Сообщений: 2,281
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
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,937
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:15     Что передаётся в функцию, если в прототипе ссылка? #6
Цитата Сообщение от freemanc Посмотреть сообщение
все верно, функция получает переменную по ссылке
Это понятие языков более высокого уровня.
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
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,937
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:17     Что передаётся в функцию, если в прототипе ссылка? #8
Цитата Сообщение от coloc Посмотреть сообщение
эквивалентно
попробуйте swap(NULL,NULL) сделать в примере с ссылками.
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,469
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
903 / 458 / 40
Регистрация: 01.10.2012
Сообщений: 2,281
04.12.2012, 20:21     Что передаётся в функцию, если в прототипе ссылка? #10
Цитата Сообщение от Croessmah Посмотреть сообщение
попробуйте swap(NULL,NULL) сделать в примере с ссылками.
А почему нет?
C++
1
swap(*(int *) NULL, *(int *) NULL);
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,937
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:23     Что передаётся в функцию, если в прототипе ссылка? #11
Цитата Сообщение от Igor3D Посмотреть сообщение
А почему нет?
это уже другое.
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.12.2012, 20:26     Что передаётся в функцию, если в прототипе ссылка? #12
Croessmah, тоесть ссылки не могут указывать в никуда? Компилятора просто сейчас нету
ЗЫ А как это - указатель в никуда? (тоесть NULL?) Куда он начинает указывать при инициализации?
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,937
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:27     Что передаётся в функцию, если в прототипе ссылка? #13
Ссылки - это целый механизм и сравнивать его с указателями как-то не хорошо. Как это реализуется на низком уровне - можно узнать, посмотрев код на мнемонике ассемблера.
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
04.12.2012, 20:30     Что передаётся в функцию, если в прототипе ссылка? #14
Мда... Я осознал , что я чайник в еще большей степени, чем есть
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,937
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 20:30     Что передаётся в функцию, если в прототипе ссылка? #15
Цитата Сообщение от coloc Посмотреть сообщение
Croessmah, тоесть ссылки не могут указывать в никуда? Компилятора просто сейчас нету
ЗЫ А как это - указатель в никуда? (тоесть NULL?) Куда он начинает указывать при инициализации?
Это я к тому, что ссылки контролируются еще и компилятором, в отличии от указателей.
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
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++ Строка не передаётся в функцию
C++ Имена аргументов в прототипе функции
Что значит void в прототипе? C++
C++ В функцию через указатель передаётся массив ТОЛЬКО с первым[0] элементом
C++ Найти минимальный и максимальный элементы (неожиданное поведение программы: массив не передаётся в функцию)

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

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

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