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

Передача по ссылке - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
31.07.2012, 18:39     Передача по ссылке #1
В учебнике написано, что можно использовать функцию с левой стороны операции присваивания, если она возвращает ссылку. Например, так:
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 &swap(int &x){
    x++;         //инкремент переменной на которую ссылается x
    
    return x;    //возврат ссылки
}
 
int main(){
    int x = 100;
    
    cout << swap(x) << "\n";
    
    swap(x) = 2; //теперь x = 2;
    cout << x << "\n";
 
    return 0;
}
Я попробовал сделать передачу по ссылке вручную так
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 *swap(int *x){
    (*x)++;       //инкремент переменной на которую ссылается x
    
    return x;    //возврат указателя
}
 
 
 
int main(){
    int x = 100;
    
    cout << swap(&x) << "\n";
    
    *swap(&x) = 2; //теперь x = 2;
    cout << x << "\n";
 
    return 0;
}
и попробовал последнее ещё так:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 #include <iostream>
using namespace std;
 
int *swap(int x){
          
    int *t = &x;
    return t;
}
 
 
 
int main(){
    int x = 100;
    
    cout << swap(x) << "\n";
    
    *swap(x) = 2; //x почему - то не изменился?;
    cout << x << "\n";
 
    return 0;
}#include <iostream>
using namespace std;
 
int *swap(int x){
          
    int *t = &x;
    return t;
}
 
 
 
int main(){
    int x = 100;
    
    cout << swap(x) << "\n";
    
    *swap(x) = 2; //x почему - то не изменился?;
    cout << x << "\n";
 
    return 0;
}
Почему в последнем примере не изменился x?

Добавлено через 5 минут
И вот ещё последнее очень интересно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int *swap(int x){
          
    int *t = &x;
    return t;
}
 
 
 
int main(){
    int x = 100;
    int *;
    cout << swap(x) << "\n";
    
    p = swap(x) ; // p указатель  на x
    *p =2;          //присвоим x = 2;
    cout << *p;    //выведет значение 2
    cout << x << "\n"; //выведет значение 100
 
    return 0;
}
Объясните пожалуйста 2 последних пример (особенное последний). Не пойму p ссылается на локальную переменную ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2012, 18:39     Передача по ссылке
Посмотрите здесь:

C++ передача параметров по ссылке
Передача по указателю и по ссылке C++
Передача параметра по ссылке C++
Передача структуры по ссылке C++
Передача по константной ссылке C++
C++ Передача значения по ссылке
C++ Передача по ссылке
Передача по ссылке C++
C++ Enum передача по ссылке
Передача массива по ссылке C++
Передача параметра по ссылке C++
C++ Передача вектора по ссылке

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
31.07.2012, 18:45     Передача по ссылке #2
В последнем примере:

C++
1
2
3
4
5
6
int *swap(int x) // создается локальная переменная x (копия переданного аргумента)
{
          
    int *t = &x; // берется адрес этой локальной копии (не исходного x!!!)
    return t; // возвращается этот адрес
}
То есть в p лежит не адрес переменной x из main, а адрес локальной переменной x из функции swap (это разные переменные). Так вообще делать нельзя, поскольку автоматические переменные уничтожаются при выходе из функции. Т.е. не возвращайте ссылки или указатели на локальные переменные.

Выход - передать аргумент по ссылке, т.е.
C++
1
int *swap(int & x)
Тогда не будет локальных копий переменной.
PreFX
25 / 20 / 1
Регистрация: 14.07.2012
Сообщений: 176
31.07.2012, 18:47     Передача по ссылке #3
Почему в последнем примере не изменился x?
Хм, а где тут, собственно, передача по ссылке? Передача по ссылке осуществляется так:

C++
1
2
3
4
5
6
7
8
9
10
11
int& swap ( int& x)
{
    return x;
}
 
int main ()
{
int x=100;
swap(x)=2;
return 0;
}
А в вашем примере используется указатель, значение которого указывает на удалённую переменную.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
31.07.2012, 18:52  [ТС]     Передача по ссылке #4
Цитата Сообщение от Schizorb Посмотреть сообщение
В последнем примере:

C++
1
2
3
4
5
6
int *swap(int x) // создается локальная переменная x (копия переданного аргумента)
{
          
    int *t = &x; // берется адрес этой локальной копии (не исходного x!!!)
    return t; // возвращается этот адрес
}
То есть в p лежит не адрес переменной x из main, а адрес локальной переменной x из функции swap (это разные переменные). Так вообще делать нельзя, поскольку автоматические переменные уничтожаются при выходе из функции. Т.е. не возвращайте ссылки или указатели на локальные переменные.

Выход - передать аргумент по ссылке, т.е.
C++
1
int *swap(int & x)
Тогда не будет локальных копий переменной.
Да, я в принципе так и думал. НО локальная переменная уничтожается при выходе из функции. Тогда в последнем примере я должен увидеть на экране мусор, а не значение локальной переменной, которой уже нет.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
31.07.2012, 19:00     Передача по ссылке #5
Цитата Сообщение от bgm313 Посмотреть сообщение
Тогда в последнем примере я должен увидеть на экране мусор
Не факт, что там будет мусор... Вы просто возвращаете адрес того места, где была переменная. Непосредственно после вызова функции там возможно остается лежать прежнее значение. Но полагаться на это нельзя, эта область памяти впоследствии может быть заполнена другим значением.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1238 / 987 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
31.07.2012, 19:01     Передача по ссылке #6
Цитата Сообщение от bgm313 Посмотреть сообщение
Да, я в принципе так и думал. НО локальная переменная уничтожается при выходе из функции. Тогда в последнем примере я должен увидеть на экране мусор, а не значение локальной переменной, которой уже нет.
Почему её нет, она там есть. Возможно. А возможно уже мусор. Это просто операционная система не даёт по рукам линейкой за обращения к памяти, которая была уже удалена delete.
Yandex
Объявления
31.07.2012, 19:01     Передача по ссылке
Ответ Создать тему
Опции темы

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