быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

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

08.10.2010, 22:20. Показов 3970. Ответов 38
Метки нет (Все метки)

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

Добавлено через 10 минут
...А то я дальше продвинуться не могу
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2010, 22:20
Ответы с готовыми решениями:

Создать бинарное дерево, по правой ветке - переменные типа инт, по левой - 2 переменные типа чар
Здравствуйте. Необходимо создать бинарное дерево, по правой ветке - переменные типа инт, по левой...

Rvalue ссылочного типа
Может ли в С++ rvalue иметь тип ссылки? Если да, то хотелось бы увидеть пример.

классы с использованием ссылочного типа данных.
Задали задачу на классы с использованием ссылочного типа данных, а я даже не знаю, что это за тип и...

Переменная ссылочного типа в прототипе функции
Только начала изучать C++ и эти прототипы функций нигде не всртечал. Прописываю прототип функции со...

38
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 00:45 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Ссылка и вводилась в C++ как безопасная замена указателю.
Ссылка не замена указателю, и них разное предназначение. Указатели используются для передачи аргументов для модификации или когда параметр может быть опциональным. Ссылки же, за редким исключением (типа std::swap, когда и так понятно, что аргументы будут модифицироваться), используются для передачи аргумента для чтения, при этом ссылка является константной.
"Ненулевость" ссылок особого значения не имеет, т.к. проверить указатель на ноль труда не составляет.
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
09.10.2010, 00:56 22
Указатель тоже можно объявить константным и передавать только для чтения. Но использование ссылок при передаче в функции удобнее, да и лишних проверок не надо.
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 00:57 23
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Но использование ссылок при передаче в функции удобнее
Ну вот ты и подошел к тому, что я говорил с самого начала.
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
09.10.2010, 00:59 24
Так я и не спорил с тем, что это удобнее, я о том, что удобность не единственный плюс ссылок=)))
0
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
09.10.2010, 01:02 25
А вобще существует ли то, что можно реализовать с помощью ссылок, но нельзя с помощью указателей(кроме полиморфизма) или наоборот ?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.10.2010, 01:04 26
KuKu, А возможно заменить в еде колбасу на шину? У них несколько разные предназначения. Как и у ссылок с указателями.
0
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
09.10.2010, 01:08 27
Lavroff, но в еде колбасу на шину не заменить даже если оч захочешь, а тут вродь получается.
0
ForEveR
09.10.2010, 01:09
  #28

Не по теме:

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

0
KuKu
09.10.2010, 01:10
  #29

Не по теме:

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

0
ForEveR
09.10.2010, 01:12
  #30

Не по теме:

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

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

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

Только еле-еле начал переползать в MS VS.
Ну, может я самонадеян слишком, не знаю.
0
11 / 11 / 2
Регистрация: 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
В итоге код получается абсолютно одинаковым - байт в байт.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
09.10.2010, 02:14  [ТС] 33
Наверное, тот случай слишком лёгкий. Эх, здорово было бы рассмотреть под микроскопом передачу ссылочного аргумента в функцию член какого-нибудь класса:
"Одна из основных причин, из-за которой язык С++ вынужден поддерживать ссылки, заключается в том, что вы могли написать конструктор копирования. Без такого синтаксиса задача была бы невыполнимой"
Далее приводятся аргументы.

Брайан Оверленд, "C++ без страха"
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 02:22 34
kravam, ассемблерный код всегда будет одинаков, ссылки это всего лишь "плюшка" языка и не более.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
09.10.2010, 02:34  [ТС] 35
В таком случае всё сводится к удобству-неудобству использования ссылок и указателей. Для меня к очень мнимому и сомнительному.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.10.2010, 02:52 36
kravam, Ну так. Что мешает развеять эти сомнения? Практика и еще раз практика.
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 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
}
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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 Посмотреть сообщение
т.к. проверить указатель на ноль труда не составляет.
Но занимает процессорное время, а если полезеных операций на одну проверку будет приходиться мало, то прога будет тормозить на проверках.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
20.06.2011, 16:31  [ТС] 39
taras atavin, я так-то со всем разобрался, ссылки суть те же указатели, только без использования синтаксиса указателей, всё остальное прилагается.

Кстати, как вообще концептуально решить применение константы в качестве изменяемого параметра?
а вот этого я не знаю, да это, наверное и неважно. Константа пусть остаётся константой, а изменяемый параметр таковым
0
20.06.2011, 16:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.06.2011, 16:31
Помогаю со студенческими работами здесь

Переменные ссылочного типа
Объясните, пожалуйста у переменной ссылочного типа помимо адреса на который она ссылается имеется...

Переменные ссылочного типа
Возник вопрос при присваивании переменных ссылочного типа. Пример кода public struct Person {...

Переменные ссылочного типа и присваивание
Есть класс class cTest { //Множество методов и значений } также cTest DemoTest = new...

Как описываются переменные типа запись? В каких случаях целесообразно использовать переменные типа запись?
1. Как описываются переменные типа запись? 2. В каких случаях целесообразно использовать...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru