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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 213, средняя оценка - 4.71
thedriveee
3 / 3 / 1
Регистрация: 16.09.2012
Сообщений: 107
#1

Передача данных по значению и по ссылке - C++

18.09.2012, 21:57. Просмотров 31572. Ответов 32
Метки нет (Все метки)

Всем привет!

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

*var и &var в чем между ними разница, когда мы их передаем в качестве параметров функции?

Заранее спс за хелп!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2012, 21:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача данных по значению и по ссылке (C++):

Передача по ссылке и по значению - C++
Эта тема стара как мир, но я хотел уточнить одну вещь. QBluetoothAddress* address = new QBluetoothAddress("00:1A:7D:DA:71:15"); ...

Передача std::string по константной ссылке \ значению - C++
Суть вопроса: есть простенький словарь с std::vector в качестве приватного поля. struct StudentGrade { std::string name; char...

Передача параметров в функцию по значению, по ссылке и по указателю - C++
Доброе время суток товарищи программисты. Столкнулся с кучей ошибок в написании простой программы. Задача заключается в том чтобы написать:...

Передача параметров функции по значению, ссылке и указателю - C++
Вычислить F=f(a)-5f^3(sin(b/2))+1/f(1+c^4), де f(x)=3x^2-2x^2+7, при a=5.08, b=-0.65, c=3.87 Добавлено через 45 минут #include...

Передача параметров в функцию по значению, по ссылке или по указателю - C++
Передача параметров в функцию по значению, по ссылке или по указателю. Чем отличаются эти 3 способа. И, если не сложно, привести...

Указатели, адресная арифметика и передача аргументов функций по значению и по ссылке - C++
Подскажите, пожалуйста, как решить такую задачу вручную. На экзамене предложат задание такого типа НА БУМАГЕ, и надо будет написать, что...

32
hoggy
6636 / 2821 / 484
Регистрация: 15.11.2014
Сообщений: 6,240
Завершенные тесты: 1
29.01.2015, 20:08 #16
Цитата Сообщение от Gourmand Посмотреть сообщение
Не верю, что ссылка лучше оптимизируется. Адресация на уровне команд процессора соответствует как раз случаю, когда именно указатель в регистре находится, и при необходимости индексируется содержимым другого регистра или ячейки памяти.
Мне на самом деле не очень интересно во что вы верите.
Передача в функцию по ссылке или указателю

Цитата Сообщение от Gourmand Посмотреть сообщение
Еще чаще в случае "объект не существует, работать с ним нельзя". Такое распространено при использовании плагинов.
Ну это уже из области низкой квалификации.
Если без живого объекта работать нельзя, значит указатель не нужен.
Тут по смыслу нужна именно ссылка, и на нуль проверять не придется.

Нафига принимать указатель, что бы потом обязательно проверять его на nullptr,
а пользователя напрягать: вот прототип принимает указатель,
но сюда обязательно нужно живой объект, а не просто адрес.

Цитата Сообщение от Gourmand Посмотреть сообщение
Наилучший пример - мощный и развитый мультиплатформенный фреймворк Qt. В нем передача параметров по ссылке почти не используется, а по указателям сплошь и рядом.
В нем ничего не мешает использовать ссылки.

Что до идеологии - не видитесь на авторитеты.
Они и шаблоны изначально не осилили.
Им показалось проще запилить собственный костыль-препроцессор, нежели осилить boost::function и аналоги для создания технологии слотов/сигналов.

Вот и получилось, что кютешные слоты/сигналы - тормозной рантайм.
На вскидку они в тысячи раз медленнее работают, чем тот же std::function

Хорошая новость в том, что использовать std::function там так же ничего не мешает.

Цитата Сообщение от Gourmand Посмотреть сообщение
Но при этом имеет меньше "мощности", чем указатель.
"Мощность" ради "мощности" не нужна.

Цитата Сообщение от Gourmand Посмотреть сообщение
То есть, именно 1-й вариант - это для тех, кто имеет ниже квалификацию, не умеет грамотно работать с указателями.
По поводу квалификации:
-- там где по смыслу требуется работать именно с указателем, работают с указателем.

-- там где по смыслу требуется работать с живым объектом ,
работают с ссылкой, или с объектом по значению (зависит от ситуации)

Использования вещи не по назначению:
Нужен живой объект. Но мы же не ищем легких путей.
Сначала мы сделаем кривой сбивающий с толку прототип,
а потом начнем вставлять проверки: а живой ли нам прислали?

Вот это уже признак низкой квалификации.
0
Croessmah
Эксперт CЭксперт С++
13409 / 7559 / 853
Регистрация: 27.09.2012
Сообщений: 18,608
Записей в блоге: 3
Завершенные тесты: 1
29.01.2015, 20:15 #17
Первый пост: 18.09.2012
Спустя более полугода подняли тему: 25.04.2013
Прошло больше года и снова подняли: 04.06.2014
И теперь еще раз: 28.01.15

Дайте уже умереть этой теме спокойно, некроманты

Добавлено через 20 секунд
Первый пост: 18.09.2012
Спустя более полугода подняли тему: 25.04.2013
Прошло больше года и снова подняли: 04.06.2014
И теперь еще раз: 28.01.15

Дайте уже умереть этой теме спокойно, некроманты
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
29.01.2015, 23:33 #18
Цитата Сообщение от hoggy Посмотреть сообщение
Они и шаблоны изначально не осилили. Им показалось проще запилить собственный костыль-препроцессор, нежели осилить boost::function и аналоги для создания технологии слотов/сигналов.
Ну справедливости ради надо сказать, что QT начинали писать чуть-ли не в начале 90-х. В те времена плюсы были мягко говоря, кхм, не в лучшей своей форме. Поэтому ничего удивительного, все фреймворки и библиотеки того времени велосипедили со страшной силой ( тот же MFC например ). Какой уж там boost::function

Цитата Сообщение от Gourmand Посмотреть сообщение
То есть, именно 1-й вариант - это для тех, кто имеет ниже квалификацию, не умеет грамотно работать с указателями.
Пололлировал. Детектирую в тебе C'шника. Грамотно работать с указателями". Для любого человека в теме это звучит примерно как: грамотно работать с таблицей умножения. Но только C'шники говорят об этом с придыханием, как о нечто удивительном.

Весь мир старается любой ценой бороться со сложностью разработки, но мы-то, благодаря Gourmand'у, теперь знаем, что это все ерунда. Решение оказывается простое - надо-то всего лишь никогда не делать ошибок, лол.
0
Gourmand
1 / 1 / 1
Регистрация: 29.01.2015
Сообщений: 65
30.01.2015, 14:06 #19
Цитата Сообщение от hoggy Посмотреть сообщение
Им показалось проще запилить собственный костыль-препроцессор, нежели осилить boost::function и аналоги для создания технологии слотов/сигналов.

Вот и получилось, что кютешные слоты/сигналы - тормозной рантайм.
На вскидку они в тысячи раз медленнее работают, чем тот же std::function
Типичная демонстрация непонимания, зачем и почему сигнал-слоты именно так сделаны, как сделаны. На самом деле,
C++
1
Qt::DirectConnection
работает со скоростью прямых вызовов. А остальные реализованы через очередь, также и с возможностью блокировки. Причем очередь автоматически работает для любых зарегистрированных типов данных. Что позволяет с помощью QThread легко делать асинхронную параллельную обработку данных без использования семафоров или мутексов (хотя они тоже в Qt есть). И фреймворк Qt потом это всё сам раскидывает по процессорным ядрам. Где тут рядом лежит boost, не видно совершенно.

Добавлено через 4 минуты
Цитата Сообщение от Voivoid Посмотреть сообщение
Грамотно работать с указателями". Для любого человека в теме это звучит примерно как: грамотно работать с таблицей умножения. Весь мир старается любой ценой бороться со сложностью разработки.
Бороться с указателями - всё равно, что бороться с таблицей умножения. И работать с указателями также несложно, как с таблицей умножения. Но этого почему-то большинство программистов страшно боится. Хотя это более мощный механизм, чем ссылки. В результате с использованием только ссылок код получается более громоздкий и сложный. То есть, эффект ровно обратный.
0
hoggy
6636 / 2821 / 484
Регистрация: 15.11.2014
Сообщений: 6,240
Завершенные тесты: 1
30.01.2015, 14:40 #20
Цитата Сообщение от Voivoid Посмотреть сообщение
Какой уж там boost::function
Ну хз, может быть.

Цитата Сообщение от Gourmand Посмотреть сообщение
На самом деле, Qt:irectConnection работает со скоростью прямых вызовов. А остальные реализованы через очередь, такж и с возможностью блокировки. Причем очередь автоматически работает для любых зарегистрированных типов данных. Что позволяет легко делать асинхронную параллельную обработку данных без использования семафоров или мутексов (хотя они тоже в Qt есть). И фреймворк потом это сам раскидывает по процессорным ядрам.
Очевидно, что все тоже самое можно было бы сделать и без необходимости велосипедить собственный препроцессор.

Но мне бы не хотелось сейчас скатываться в тему кути.
Кутя - замичательный фреймворк.
И его киллер-фича - это тщательно продуманный дизайн.
Имхо: один из лучших в своем роде.

Цитата Сообщение от Gourmand Посмотреть сообщение
И работать с указателями также несложно, как с таблицей умножения. Но этого почему-то большинство программистов страшно боится. Хотя это более мощный механизм, чем ссылки.
Меня забавляют люди, которые используют слово "боится".
Право же - детский сад.

Классика жанра:

- я использую RAII, смарты. И мне больше не приходится вручную за всем следить

- да ты просто не осилил сырых указателей, и боишься вручную использовать new !!!!!
А по поводу мощностей:

- мы хотим ездить по городу и цеплять молоденьких цыпочек. Нам нужен легковое спортивное авто.
- давай купим танк.
- ????
- но ведь он более мощный...
Ответьте мне на один простой вопрос: зачем?

Зачем вам нужны "мощности указателя", если все что вам нужно в этой конкретной задаче,
для этой конкретной функции - это работать с нормальным, живым объектом?
----------------------------------

Я уже просто промолчал о том, что ссылки обладают свойствами,
которые в принципе не доступны указателям.

Но эти свойства позволяют на с++ проворачивать такие штуки,
которые сишникам и не снились.

Цитата Сообщение от Gourmand Посмотреть сообщение
В результате код получается более громоздкий и сложный.
Неужели?

Вообще то как раз таки наоборот.

Обращение с ссылкой столь же простое, как и с обычным объектом.
Её и нужно воспринимать, как псевдоним оригинального объекта.
И код получается таким же простым, как будто бы вы работаете с обычным объектом.


В отличи от указателя, который как минимум нужно проверять на нулль,
думать о том, нужно ли выделять/чистить память для него, и тд и тп.


------------------------------------------------------------------

Использование указателя там, где по смыслу нужна ссылка - это выдает либо новичка,
который ни бум бум,
либо сишника, чьи мозги настолько закостенели,
что уже просто не в состоянии перестроится на с++ лад.
1
zer0mail
2342 / 1972 / 193
Регистрация: 03.07.2012
Сообщений: 7,090
Записей в блоге: 1
30.01.2015, 14:45 #21
Цитата Сообщение от Gourmand Посмотреть сообщение
В результате с использованием только ссылок код получается более громоздкий и сложный. То есть, эффект ровно обратный.
Вот оно в чем дело - оказывается, разработчики библиотек (ввода-вывода, STL и др) просто боятся указателей и поэтому используют ссылки .
0
Gourmand
1 / 1 / 1
Регистрация: 29.01.2015
Сообщений: 65
30.01.2015, 15:12 #22
Цитата Сообщение от hoggy Посмотреть сообщение
все тоже самое можно было бы сделать и без необходимости велосипедить собственный препроцессор
Это тоже непонимание. Во-1ых, без moc всё выглядело бы громоздко и муторно. Во-2ых, он в работе совершенно прозрачен, как будто его и нет вовсе.

Цитата Сообщение от hoggy Посмотреть сообщение
В отличи от указателя, который как минимум нужно проверять на нулль,
Нулевой указатель означает, что "нет экземпляра объекта". При использовании ссылок для этого надо заводить булев флажок - лишняя сущность. Хотя проверять его всё равно надо.

Цитата Сообщение от hoggy Посмотреть сообщение
просто не в состоянии перестроится на с++ лад
Еще раз - весь Qt построен на указателях, а не на ссылках. Тем не менее, это действительно один из лучших, а скорее, самый лучший фреймворк.
0
hoggy
6636 / 2821 / 484
Регистрация: 15.11.2014
Сообщений: 6,240
Завершенные тесты: 1
30.01.2015, 15:30 #23
Цитата Сообщение от Gourmand Посмотреть сообщение
Это тоже непонимание. Во-1ых, без moc всё выглядело бы громоздко и муторно.
ну вот поэтому их и прозвали "неосиляторы шаблонов".

Цитата Сообщение от Gourmand Посмотреть сообщение
во-2ых, он в работе совершенно прозрачен, как будто его и нет вовсе.
а ещё кютешный диалект перестал быть "чистым с++".

Это последнее по поводу кути.
Больше на оффтопик я не пойду.

Цитата Сообщение от Gourmand Посмотреть сообщение
Нулевой указатель означает, что "нет экземпляра объекта".
При использовании ссылок для этого надо заводить булев флажок - лишняя сущность.
Хотя проверять его всё равно надо.
Это что за бред?

У вас есть обычный объект (не указатель и не ссылка).
Вам нужен специальный флажок, что бы убедиться, есть у вас действительно есть обычный объект?
Вот с ссылками тоже самое.

Цитата Сообщение от Gourmand Посмотреть сообщение
Еще раз - весь Qt построен на указателях, а не на ссылках.
И что?

Из того, что кьют - отличный фреймворк не следует,
что теперь нужно уподобляться этим неосиляторам шаблонов.
0
Gourmand
1 / 1 / 1
Регистрация: 29.01.2015
Сообщений: 65
30.01.2015, 16:52 #24
Цитата Сообщение от hoggy Посмотреть сообщение
поэтому их и прозвали "неосиляторы шаблонов"
шаблоны там ни при чем совершенно - они не могут заменить moc, он выполняет совершенно другие функции

и шаблоны в Qt давно используются, но там, где действительно имеют смысл (QList и др.), классов на шаблонах, на самом деле, не мало

Цитата Сообщение от hoggy Посмотреть сообщение
Вам нужен специальный флажок, что бы убедиться, есть у вас действительно есть обычный объект?
когда экземпляры объектов связаны, и эти связи меняются динамически - да, нужен

на самом деле, при работе с Qt ссылки действительно не нужны
0
hoggy
6636 / 2821 / 484
Регистрация: 15.11.2014
Сообщений: 6,240
Завершенные тесты: 1
30.01.2015, 19:16 #25
Цитата Сообщение от Gourmand Посмотреть сообщение
когда экземпляры объектов связаны, и эти связи меняются динамически - да, нужен
бред какой то.
0
Gourmand
1 / 1 / 1
Регистрация: 29.01.2015
Сообщений: 65
30.01.2015, 19:41 #26
Цитата Сообщение от hoggy Посмотреть сообщение
бред какой то.
Гы... то есть, например, с динамически меняющимся деревом, в котором одни и те же узлы могут быть разных классов, дел иметь не приходилось. Ну бывает...
0
hoggy
6636 / 2821 / 484
Регистрация: 15.11.2014
Сообщений: 6,240
Завершенные тесты: 1
30.01.2015, 19:58 #27
Цитата Сообщение от Gourmand Посмотреть сообщение
Гы... то есть, например, с динамически меняющимся деревом, в котором одни и те же узлы могут быть разных классов, дел иметь не приходилось. Ну бывает...
Я попрошу вас не делать "гы", когда вы общаетесь со мною.
Потому что я могу подумать о вас, что вы - дурачок, и перестать с вами общаться.

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

А что касается дерева - зачем такие сложности?

Я имею ввиду, ваши "разные классы" - это было избыточно.
Достаточно просто было сказать, что нода может иметь родителя,
а может и не иметь, или сменить родителя на другого.

Этого вполне будет достаточно, что бы по смыслу задачи ссылка уже не подошла.

Вы понимаете к чему я клоню?
0
Gourmand
1 / 1 / 1
Регистрация: 29.01.2015
Сообщений: 65
30.01.2015, 20:12 #28
Цитата Сообщение от hoggy Посмотреть сообщение
попрошу вас не делать "гы", когда вы общаетесь со мною.
на юге России "гы" - это аналог "хм", и ничего личного

Цитата Сообщение от hoggy Посмотреть сообщение
Достаточно просто было сказать, что нода может иметь родителя,
а может и не иметь, или сменить родителя на другого.
Этого вполне будет достаточно, что бы по смыслу задачи ссылка уже не подошла.
Тоже самое, только другими словами. У каждого свой язык C++. (С) Понимаете, к чему я клоню?
0
hoggy
6636 / 2821 / 484
Регистрация: 15.11.2014
Сообщений: 6,240
Завершенные тесты: 1
30.01.2015, 21:30 #29
Цитата Сообщение от Gourmand Посмотреть сообщение
Тоже самое, только другими словами. У каждого свой язык C++. (С) Понимаете, к чему я клоню?
Нет, это не тоже самое.

Вот это - тоже самое:
Цитата Сообщение от hoggy Посмотреть сообщение
-- там где по смыслу требуется работать именно с указателем, работают с указателем.
-- там где по смыслу требуется работать с живым объектом ,
работают с ссылкой, или с объектом по значению (зависит от ситуации)
--------------------------------

Я покажу на примере:

Вы там что-то обмолвились о деревьях. Хорошо, пускай будет дерево.
(правда это не совсем дерево, это - граф, но не суть).

Итак, есть некоторое дерево,
которое представляет собой форму с элементами пользовательского интерфейса:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
auto form = 
  Form::create("form")
    .size(10,10)    
    .position(100,100)
    .title("Form")   
    .Widget<Box>("box1") 
      .size(10,10) 
      .position(100,100)
    .init()          
    .Widget<Box>("box2") 
      .size(10,10)
      .position(100,100)
    .init();
Причем, эту форму можно составлять, как статически (как показано выше), так и динамически.
Например, можно создать отдельно элемент "метка":

C++
1
2
3
4
5
6
auto label = 
    Form::create<Label>("label")  
        .size(10,10)
        .position(100,100)
        .text("this is label")
    .init();
А потом вставить её в формочку:

C++
1
form.Add(label);
При этом, форма на самом деле представляет собой граф,
который работает по ссылочной семантике.
Одни и те же элементы можно прицеплять сразу в нескольких местах,
Кроме того, допустимо создавать циклические взаимосвязи и тд, и тп.

Главное, что сейчас нужно понять:
один и тот же элемент может иметь сразу нескольких родителей.
Причем часть этих родителей могут быть из одной формы, а часть вообще из другой.
А может и вовсе не иметь. Он сам может оказаться "главное формой".

Поехали дальше:

Есть функция. Задача которой - найти первого попавшегося родителя элемента,
который принадлежит указанной форме:

C++
1
Form* Find(const Form& form, const Form& element);
Внимательно прочтите данный прототип и ответьте мне на следущие вопросы:
1. Почему возвращается указатель, а не ссылка?
2. Почему в качестве формы и элемента использованны именно ссылки, а не указатели?
3. Почему указатель не помечен квалификатором const ?
4. Почему ссылки помечены квалификатором const?
-----------------------------------------------------------------------------------------

Что до плюсов: правила языка едины для всех.

Просто некоторые не очень дружат со здравым смыслом,
и любят заходить на первый этаж через чердак.
0
Gourmand
1 / 1 / 1
Регистрация: 29.01.2015
Сообщений: 65
30.01.2015, 23:28 #30
Oh, my... Совсем не то, что я имел в виду. То есть, абсолютно не то. Ну да ладно.

Делайте сами, читайте сами - я ни на какие "вопросы" отвечать не собираюсь. Не в коня вопрос...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2015, 23:28
Привет! Вот еще темы с ответами:

Передача аргумента в функцию по значению, по ссылке, по указателю: в чём концептуальная разница? - C++
Доброго всем здравия, прошу прощения, что достал уже всех этой темой. #include &lt;iostream&gt; using namespace std; int my_attemp(int...

Сравнение утраивания переменной по значению и по ссылке - C++
У Дейтлов есть задача: Я написал такой код: #include&lt;iostream&gt; using namespace std; #include&lt;windows&gt;

3мя способами, по значению, по ссылке, через указатель - C++
Дана последовательность действующих чисел с помощью процедуры обеспечить преобразование последовательности следующим образом: в начале...

Массив и классы (как передаётся объект: по значению или по ссылке?) - C++
Массив передаётся в функцию по ссылке, а объект по значению. Если в классе есть массив, то как передаётся объект по значению или по ссылке?


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

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

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