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

Переменные ссылочного типа. Просьба разжевать и положить в рот. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.91
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
08.10.2010, 22:20     Переменные ссылочного типа. Просьба разжевать и положить в рот. #1
А также просьба указывать только ЯВНО СТОЯЩУЮ литература, а остальная у меня есть.
...Друзья! Я ничё не понимаю. Вот, например, такой код, функция и её вызов:
C++
1
2
3
4
5
6
7
8
void  summa (int &nomer1) {
 nomer1++;
} 
 
//всякий код:
 
int a= 98;
summa (a);
Начнём с простых вопросов. Что кладётся в стек?
Адрес переменной a или значение 98? Спасибо. (Вопрос вообще для меня каверзный, позже объясню почему)

Добавлено через 10 минут
...А то я дальше продвинуться не могу
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2010, 22:20     Переменные ссылочного типа. Просьба разжевать и положить в рот.
Посмотрите здесь:

Описать переменные вещественного типа C++
C++ классы с использованием ссылочного типа данных.
C++ Исследование особенностей применения переменных ссылочного типа и указателей
C++ Создать бинарное дерево, по правой ветке - переменные типа инт, по левой - 2 переменные типа чар
C++ Переменная ссылочного типа в прототипе функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 00:45     Переменные ссылочного типа. Просьба разжевать и положить в рот. #21
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Ссылка и вводилась в C++ как безопасная замена указателю.
Ссылка не замена указателю, и них разное предназначение. Указатели используются для передачи аргументов для модификации или когда параметр может быть опциональным. Ссылки же, за редким исключением (типа std::swap, когда и так понятно, что аргументы будут модифицироваться), используются для передачи аргумента для чтения, при этом ссылка является константной.
"Ненулевость" ссылок особого значения не имеет, т.к. проверить указатель на ноль труда не составляет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
09.10.2010, 00:56     Переменные ссылочного типа. Просьба разжевать и положить в рот. #22
Указатель тоже можно объявить константным и передавать только для чтения. Но использование ссылок при передаче в функции удобнее, да и лишних проверок не надо.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 00:57     Переменные ссылочного типа. Просьба разжевать и положить в рот. #23
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Но использование ссылок при передаче в функции удобнее
Ну вот ты и подошел к тому, что я говорил с самого начала.
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
09.10.2010, 00:59     Переменные ссылочного типа. Просьба разжевать и положить в рот. #24
Так я и не спорил с тем, что это удобнее, я о том, что удобность не единственный плюс ссылок=)))
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
09.10.2010, 01:02     Переменные ссылочного типа. Просьба разжевать и положить в рот. #25
А вобще существует ли то, что можно реализовать с помощью ссылок, но нельзя с помощью указателей(кроме полиморфизма) или наоборот ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.10.2010, 01:04     Переменные ссылочного типа. Просьба разжевать и положить в рот. #26
KuKu, А возможно заменить в еде колбасу на шину? У них несколько разные предназначения. Как и у ссылок с указателями.
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
09.10.2010, 01:08     Переменные ссылочного типа. Просьба разжевать и положить в рот. #27
Lavroff, но в еде колбасу на шину не заменить даже если оч захочешь, а тут вродь получается.
ForEveR
09.10.2010, 01:09
  #28

Не по теме:

KuKu, А это уже смотря кто что хочет кушать. Кто-то может любить употреблять шины

KuKu
09.10.2010, 01:10
  #29

Не по теме:

шины из нефтеотходов - если даже будешь их есть, эт не долго будет продолжаться

ForEveR
09.10.2010, 01:12
  #30

Не по теме:

KuKu, Это частности.

kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
09.10.2010, 01:48  [ТС]     Переменные ссылочного типа. Просьба разжевать и положить в рот. #31
Цитата Сообщение от KuKu Посмотреть сообщение
А вобще существует ли то, что можно реализовать с помощью ссылок, но нельзя с помощью указателей(кроме полиморфизма) или наоборот ?
Работая со структурами PE файла, я поднаторел с указателями. Мне кажется, любой код, где есть ссылки я заменю на код с указателями и память не потеряю.
Язык С. конечно. НАверное, всё вышесказанное отнёс бы и к С++, но я только начал его изучать, синтаксис ещё не освоил.

Может, и придётся попотеть, но я автоматизмом не избалован, работаю в DEV C++, всё вручную, всё на коленке, все проверки, выделение памяти и прочее...

Только еле-еле начал переползать в MS VS.
Ну, может я самонадеян слишком, не знаю.
StUser
10 / 10 / 1
Регистрация: 09.10.2010
Сообщений: 23
09.10.2010, 02:06     Переменные ссылочного типа. Просьба разжевать и положить в рот. #32
Ссылки, указатели. Какая разница? Код взял из стартового сообщения, компилил с /FAs, в итоге:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; 1    : void  summa (int &nomer1) {
    push    ebp
    mov ebp, esp
; 2    :  nomer1++;
    mov eax, DWORD PTR _nomer1$[ebp]
    mov ecx, DWORD PTR [eax]
    add ecx, 1
    mov edx, DWORD PTR _nomer1$[ebp]
    mov DWORD PTR [edx], ecx
; 3    : } 
    pop ebp
    ret 0
.....
; 10   :  summa (a);
    lea eax, DWORD PTR _a$[ebp]
    push    eax
    call    ?summa@@YAXAAH@Z            ; summa
    add esp, 4
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; 1    : void  summa (int *nomer1) {
    push    ebp
    mov ebp, esp
; 2    :  (*nomer1)++;
    mov eax, DWORD PTR _nomer1$[ebp]
    mov ecx, DWORD PTR [eax]
    add ecx, 1
    mov edx, DWORD PTR _nomer1$[ebp]
    mov DWORD PTR [edx], ecx
; 3    : } 
    pop ebp
    ret 0
.....
; 10   :  summa (&a);
    lea eax, DWORD PTR _a$[ebp]
    push    eax
    call    ?summa@@YAXPAH@Z            ; summa
    add esp, 4
В итоге код получается абсолютно одинаковым - байт в байт.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
09.10.2010, 02:14  [ТС]     Переменные ссылочного типа. Просьба разжевать и положить в рот. #33
Наверное, тот случай слишком лёгкий. Эх, здорово было бы рассмотреть под микроскопом передачу ссылочного аргумента в функцию член какого-нибудь класса:
"Одна из основных причин, из-за которой язык С++ вынужден поддерживать ссылки, заключается в том, что вы могли написать конструктор копирования. Без такого синтаксиса задача была бы невыполнимой"
Далее приводятся аргументы.

Брайан Оверленд, "C++ без страха"
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 02:22     Переменные ссылочного типа. Просьба разжевать и положить в рот. #34
kravam, ассемблерный код всегда будет одинаков, ссылки это всего лишь "плюшка" языка и не более.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
09.10.2010, 02:34  [ТС]     Переменные ссылочного типа. Просьба разжевать и положить в рот. #35
В таком случае всё сводится к удобству-неудобству использования ссылок и указателей. Для меня к очень мнимому и сомнительному.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.10.2010, 02:52     Переменные ссылочного типа. Просьба разжевать и положить в рот. #36
kravam, Ну так. Что мешает развеять эти сомнения? Практика и еще раз практика.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 14:09     Переменные ссылочного типа. Просьба разжевать и положить в рот. #37
Цитата Сообщение от kravam Посмотреть сообщение
В таком случае всё сводится к удобству-неудобству использования ссылок и указателей. Для меня к очень мнимому и сомнительному.
Без ссылок у тебя не получится написать конструктор копирования, перегрузки операторов. Так что ничего мнимого нет, у константных ссылок свое явное предназначение - передача в качестве аргумента объектов пользовательских типов для чтения. А неконстантные ссылки можно, в принципе, и не рассматривать вовсе, они используются довольно редко и также для удобства, пример:
C++
1
2
3
4
5
6
std::vector<Foo> bar;
 
for (std::vector<Foo>::iterator it = bar.begin(); it != bar.end(); ++it) {
  Foo& foo = *it; // Чтобы постоянно не писать *it
  // Операции с foo
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.06.2011, 07:00     Переменные ссылочного типа. Просьба разжевать и положить в рот. #38
Цитата Сообщение от TheMachinist Посмотреть сообщение
Вообще то значение помещается в стек,а адрес в соответствующий регистр
С какого перепугу здесь будет передаваться значение? В стек помещается адрес, а значение по этому адресу читается. Регистр же используется только в оптимизированном вызове: чтоб поместить адрес в стек, его всё равно придётся загрузить в регистр, и в самой функции для доступа к адресу в стеке его также придётся загурзить в регистр, значит можно оба раза отвести для этих целей один и тот же регистр и убрать из объектного кода стековые операции.

Добавлено через 2 минуты
Цитата Сообщение от kravam Посмотреть сообщение
Ну и у нас ещё не научились параметры через регистры передавать (разве что параметры api-функций в Windows для 64-разрядных регистров, но, понятно, речь не о них сейчас)
Передача праметра чрез регистры придумана ещё на ассемблере, во времена спектрумов уже существовала, а на самих спектрумах, на сколько мне известно, была основной.

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
И вдруг "a" в последней строчке означает АДРЕС a ? Пойду переваривать.
C++
1
2
int a;
a=2;// Как ты себе представляешь приваивание двух предыдущему значению a?
Добавлено через 5 минут
Цитата Сообщение от kravam Посмотреть сообщение
А вот тут получается, надо класть адрес 98-ми, которого просто нет- вот и сижу и ничё не понимаю- как так?), ибо 98 это 98 а не перменная a, b или c, спасибо
Именно поэтому такой вызов и запрещён. Кстати, как вообще концептуально решить применение константы в качестве изменяемого параметра?

Добавлено через 7 минут
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Ссылки по эффективности ничем от указателей не отличаются, для машины разницы между ссылкой и указателем нет, это сущность лишь языка.
эффективность указателя может снижатья кучей проверок вроде
C++
1
if (p!=NULL)
или
C++
1
if (p)
, при использовании же ссылок такие проверки не требуются именно из-за того, что ссылка пустой быть не может.

Добавлено через 1 минуту
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Ссылки намного надёжнее указателей.
С какой стати?

Добавлено через 1 минуту
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
А как же безопасность кода? Ссылки намного надёжнее указателей. Хотя на низком уровне это одно и то же.
C++
1
2
3
4
5
int a;
int &b=a;
int *p=&b;
delete p;
b=2;
Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Я правильно понял, что функции нельзя передать АДРЕС на объект с помощью указателей
С помощью указателя только адрес и передаётся.

Добавлено через 54 секунды
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
А отследить такие указатели очень сложно.
Просто до полного безобразия.

Добавлено через 1 минуту
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
ли каким-то образом код у тебя сработает, то это просто случайность. Передача нулевого указателя дело очень ненадёжное. А отследить такие указатели очень сложно.
Ссылка нулевой быть не может.
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
#include <iostream>
#include <math.h>
using namespace std;
 
class A
{
public:
        void Show()
        {
                std::cout << "Show\n";
        }
};
 
void f1 (A & a)
{
        a.Show();
}
 
void f2 (A * a)
{
        a->Show();
}
 
int main()
{
  A * c = NULL;
  f1 (*c);
  f2 (c);
  return 0;
}
Добавлено через 7 минут
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
я сразу вижу, что внутри f объект a скорее всего будет модифицироватся. В случае же ссылкой, пока я не посмотрю на объявление функции, я такой вывод сделать не смогу.
Если тебе ни о чём не говорит имя функции, то по синтаксису вызова ты поёмёшь только сам факт моджификации, но не как именно изменяемый параметр модифицируется, что как раз и ведёт к ошибкам и затрудняет отладку. Причём, даже если параметр предаётся по значению, но имя функции не понятно, то беда будет та же. Хорошо, путь параметры не меняются, тогда функция возвращает значение, присваиваемое переменной, или даже обращается к глобальным данным, но ты не понимаешь, как именно меняется значение переменной слева от опреатора присваивания. Если же имя функции понятно, то говорит о её назначении позовляет сделать вывод не только о факте изменения парметров, но и о том, как именно они меняются.

Добавлено через 1 минуту
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
В одной книге прочитал, что указатели в C++ надо использовать только для динамического выделения памяти.
Согласен, но не совсем. Указатели надо использовать только для динамического выделения памяти и передачи параметров-массивов.

Добавлено через 2 минуты
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
т.к. проверить указатель на ноль труда не составляет.
Но занимает процессорное время, а если полезеных операций на одну проверку будет приходиться мало, то прога будет тормозить на проверках.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2011, 16:31     Переменные ссылочного типа. Просьба разжевать и положить в рот.
Еще ссылки по теме:

C++ Создать программу обработки массивов структур используя структурные переменные и переменные типа объеденения
C++ Переменные типа sstream
Переменные типа bool C++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
20.06.2011, 16:31  [ТС]     Переменные ссылочного типа. Просьба разжевать и положить в рот. #39
taras atavin, я так-то со всем разобрался, ссылки суть те же указатели, только без использования синтаксиса указателей, всё остальное прилагается.

Кстати, как вообще концептуально решить применение константы в качестве изменяемого параметра?
а вот этого я не знаю, да это, наверное и неважно. Константа пусть остаётся константой, а изменяемый параметр таковым
Yandex
Объявления
20.06.2011, 16:31     Переменные ссылочного типа. Просьба разжевать и положить в рот.
Ответ Создать тему
Опции темы

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