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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.91
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,460
#1

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

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

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

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

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

Переменная ссылочного типа в прототипе функции - C++
Только начала изучать C++ и эти прототипы функций нигде не всртечал. Прописываю прототип функции со ссылкой: void dectohex(int&); При...

классы с использованием ссылочного типа данных. - C++
Задали задачу на классы с использованием ссылочного типа данных, а я даже не знаю, что это за тип и как с ним работать. Вот сама задачка: ...

Исследование особенностей применения переменных ссылочного типа и указателей - C++
Создать динамический массив переменных типа int используя оператор new и указатель на массив Число элементов массива вводить с клавиатуры....

Создать программу обработки массивов структур используя структурные переменные и переменные типа объеденения - C++
Создать массив структур, каждая из которых состоит из следующих елементов: факультет, курс, группа, фамилия студента и екзаменационная...

Переменные типа sstream - C++
Добрый день! Разбираюсь с sstream .Вот простенький код. #include <iostream> #include <string> #include <sstream> using namespace std;...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
09.10.2010, 00:07 #16
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Приведи пример кода, в котором использование ссылок безопаснее использования указателей, желательно с вызовом функции.
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
#include <iostream>
#include <math.h>
using namespace std;
 
class A
{
public:
    void Show()
    {
        std::cout << "Show\n";
    }
};
 
void f (A & a)
{
    a.Show();
}
 
void f (A * a)
{
    a->Show();
}
 
int main()
{
    A a;
    A &b = a;
    A * c = NULL;
    f (b);
    f (c);
    return 0;
}
Если каким-то образом код у тебя сработает, то это просто случайность. Передача нулевого указателя дело очень ненадёжное. А отследить такие указатели очень сложно.
Ссылка нулевой быть не может.
1
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 00:09 #17
Цитата Сообщение от kravam Посмотреть сообщение
А вот с первым как быть? Я правильно понял, что функции нельзя передать АДРЕС на объект с помощью указателей (а с помощью ссылочных переменных можно)
Можно и даже, за исключением редких случаев, нужно если объект будет модифицироватся внутри функции. Правила выбора между передаче параметра по значению, по ссылке и по указателю просты:
1. Если нужно передать объект встроенного типа для чтения - передавай по значению.
2. Если нужно передать объект пользовательского типа для чтения - передавай по константной ссылке.
3. Если нужно передать объекст встроенного или пользовательского типа для модификации - используй указатели.
2
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
09.10.2010, 00:10 #18
Цитата Сообщение от kravam Посмотреть сообщение
Я правильно понял, что функции нельзя передать АДРЕС на объект с помощью указателей
Передавать можно, но нужно быть внимательнее, чтобы ссылка не была нулевой.
0
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 00:17 #19
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
C++
1
2
3
void f (A * a) {
  a->Show();
}
Всегда проверяй указатели, хотя бы для выявления нулевых указателей:
C++
1
2
3
4
5
6
7
#include <cassert>
 
void f (A * a) {
  assert(a);
 
  a->Show();
}
Теперь эта функция настолько же безопасна как и ее перегрузка со ссылкой. Но у нее есть один плюс - читая такой код:
C++
1
2
3
4
5
A a;
 
// ...
f(&a);
//...
я сразу вижу, что внутри f объект a скорее всего будет модифицироватся. В случае же ссылкой, пока я не посмотрю на объявление функции, я такой вывод сделать не смогу.

P.S. Метод Show должен быть константным.
0
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
09.10.2010, 00:32 #20
В чём-то я согласен, но чаще всего легче воспользоваться ссылкой, чем делать лишние проверки, без которых можно обойтись. Ссылка и вводилась в C++ как безопасная замена указателю. В одной книге прочитал, что указатели в C++ надо использовать только для динамического выделения памяти.

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
P.S. Метод Show должен быть константным.
Я же этот класс только для примера писал, поэтому не важно.
0
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 00:45 #21
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Ссылка и вводилась в C++ как безопасная замена указателю.
Ссылка не замена указателю, и них разное предназначение. Указатели используются для передачи аргументов для модификации или когда параметр может быть опциональным. Ссылки же, за редким исключением (типа std::swap, когда и так понятно, что аргументы будут модифицироваться), используются для передачи аргумента для чтения, при этом ссылка является константной.
"Ненулевость" ссылок особого значения не имеет, т.к. проверить указатель на ноль труда не составляет.
0
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
09.10.2010, 00:56 #22
Указатель тоже можно объявить константным и передавать только для чтения. Но использование ссылок при передаче в функции удобнее, да и лишних проверок не надо.
0
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
09.10.2010, 00:57 #23
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Но использование ссылок при передаче в функции удобнее
Ну вот ты и подошел к тому, что я говорил с самого начала.
0
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
09.10.2010, 00:59 #24
Так я и не спорил с тем, что это удобнее, я о том, что удобность не единственный плюс ссылок=)))
0
KuKu
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,985
09.10.2010, 01:02 #25
А вобще существует ли то, что можно реализовать с помощью ссылок, но нельзя с помощью указателей(кроме полиморфизма) или наоборот ?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
09.10.2010, 01:04 #26
KuKu, А возможно заменить в еде колбасу на шину? У них несколько разные предназначения. Как и у ссылок с указателями.
0
KuKu
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,985
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2010, 01:12
Привет! Вот еще темы с ответами:

Переменные типа bool - C++
Сколько переменных типа bool здесь определено: bool &amp;l1, &amp;p2, **t3, b4, *n5, w6;

Описать переменные вещественного типа - C++
в с++ выражение &quot;int a,б;&quot; значит что а и б будут принимать только натуральные значения. а как задать дробные переменные?и можно ли в...

Даны две переменные целого типа: A и B. - C++
Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной сумму этих значений, а если равны, то...

Нужно сравнить две переменные типа string - C++
Мне нужно сравнить 2 переменные типа string,нашел эту функцию,но почему то у меня выдает ошибку Error:class &quot;std...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.10.2010, 01:12
Ответ Создать тему
Опции темы

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