Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
12 / 12 / 3
Регистрация: 27.07.2012
Сообщений: 208
1

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

31.07.2012, 18:39. Просмотров 1700. Ответов 5
Метки нет (Все метки)

В учебнике написано, что можно использовать функцию с левой стороны операции присваивания, если она возвращает ссылку. Например, так:
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 ссылается на локальную переменную ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2012, 18:39
Ответы с готовыми решениями:

Передача по ссылке
Здравствуйте. 1.typedef struct { MATRIXX_LENTA&lt;double&gt;* MATR; //Ленточная матрица }...

Передача по ссылке
С помощью функции rand() округлить значение double и передать его по ссылке.

Передача по ссылке
Задание №8 из книги &quot;Объектно-ориентированное программирование в С++&quot;, 4-е издание, Роберт Лафоре,...

Передача значения по ссылке
1. Объявите (в отельном заголовочном файле) и реализуйте (в другом файле) процедуры (они не...

5
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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)
Тогда не будет локальных копий переменной.
0
26 / 21 / 2
Регистрация: 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;
}
А в вашем примере используется указатель, значение которого указывает на удалённую переменную.
1
12 / 12 / 3
Регистрация: 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)
Тогда не будет локальных копий переменной.
Да, я в принципе так и думал. НО локальная переменная уничтожается при выходе из функции. Тогда в последнем примере я должен увидеть на экране мусор, а не значение локальной переменной, которой уже нет.
0
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
31.07.2012, 19:00 5
Цитата Сообщение от bgm313 Посмотреть сообщение
Тогда в последнем примере я должен увидеть на экране мусор
Не факт, что там будет мусор... Вы просто возвращаете адрес того места, где была переменная. Непосредственно после вызова функции там возможно остается лежать прежнее значение. Но полагаться на это нельзя, эта область памяти впоследствии может быть заполнена другим значением.
1
~ Эврика! ~
1253 / 1002 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
31.07.2012, 19:01 6
Цитата Сообщение от bgm313 Посмотреть сообщение
Да, я в принципе так и думал. НО локальная переменная уничтожается при выходе из функции. Тогда в последнем примере я должен увидеть на экране мусор, а не значение локальной переменной, которой уже нет.
Почему её нет, она там есть. Возможно. А возможно уже мусор. Это просто операционная система не даёт по рукам линейкой за обращения к памяти, которая была уже удалена delete.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2012, 19:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Передача auto_ptr по ссылке
Передача auto_ptr по ссылке противоречит концепции владения. Нельзя быть полностью уверенным в...

Передача значения по ссылке
Даны два файла: fun.cpp: #include &lt;math.h&gt; double summa(float x, float eps, double&amp; psl, int&amp; k)...

Передача указателя по ссылке
Так печатается &quot;12&quot; #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; void...

Передача параметров по ссылке
Вот задание: С клавиатуры вводится число, передается в вызываемую функцию, в ней найти сумму...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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