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

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

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

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

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

Всем привет!

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

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

Заранее спс за хелп!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2012, 21:57     Передача данных по значению и по ссылке
Посмотрите здесь:
C++ Передача по ссылке и по значению
Передача параметров в функцию по значению, по ссылке и по указателю C++
C++ Передача std::string по константной ссылке \ значению
Передача параметров функции по значению, ссылке и указателю C++
Передача параметров в функцию по значению, по ссылке или по указателю C++
Указатели, адресная арифметика и передача аргументов функций по значению и по ссылке C++
Передача аргумента в функцию по значению, по ссылке, по указателю: в чём концептуальная разница? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zer0mail
2323 / 1949 / 192
Регистрация: 03.07.2012
Сообщений: 6,996
Записей в блоге: 1
30.01.2015, 14:45     Передача данных по значению и по ссылке #21
Цитата Сообщение от Gourmand Посмотреть сообщение
В результате с использованием только ссылок код получается более громоздкий и сложный. То есть, эффект ровно обратный.
Вот оно в чем дело - оказывается, разработчики библиотек (ввода-вывода, STL и др) просто боятся указателей и поэтому используют ссылки .
Gourmand
1 / 1 / 1
Регистрация: 29.01.2015
Сообщений: 65
30.01.2015, 15:12     Передача данных по значению и по ссылке #22
Цитата Сообщение от hoggy Посмотреть сообщение
все тоже самое можно было бы сделать и без необходимости велосипедить собственный препроцессор
Это тоже непонимание. Во-1ых, без moc всё выглядело бы громоздко и муторно. Во-2ых, он в работе совершенно прозрачен, как будто его и нет вовсе.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Цитата Сообщение от hoggy Посмотреть сообщение
Достаточно просто было сказать, что нода может иметь родителя,
а может и не иметь, или сменить родителя на другого.
Этого вполне будет достаточно, что бы по смыслу задачи ссылка уже не подошла.
Тоже самое, только другими словами. У каждого свой язык C++. (С) Понимаете, к чему я клоню?
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 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?
-----------------------------------------------------------------------------------------

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

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

Делайте сами, читайте сами - я ни на какие "вопросы" отвечать не собираюсь. Не в коня вопрос...
NeferSky
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 3
15.12.2015, 22:13     Передача данных по значению и по ссылке #31
А есть тут паскальщики? Я несколько лет писал на Delphi, и вот решился освоить C++. И эта тема изрядно меня беспокоит...
Может кто-нибудь проверить - я правильно транслировал примеры с Паскаля на С++?

Передача по значению:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var
  A, B: Integer;
...
procedure MyProc(C, D: Integer);
begin
  Result := C - D;
end;
 
A := 10;
B := 1;
MyProc(A, B);
Print(A); // A=10
C++
1
2
3
4
5
6
7
8
9
10
int A = 10;
int B = 1;
 
void MyProc(int C, int D)
{
  return (C - D);
}
 
MyProc(A, B);
cout << IntToStr(A); // A=10
Передача по ссылке:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var
  A, B: Integer;
...
procedure MyProc(var C, D: Integer);
begin
  Result := C - D;
end;
 
A := 10;
B := 1;
MyProc(A, B);
Print(A); // A=9
C++
1
2
3
4
5
6
7
8
9
10
int A = 10;
int B = 1;
 
void MyProc(int & C, int & D)
{
  return (C - D);
}
 
MyProc(A, B);
cout << IntToStr(A); // A=9
Передача по указателю:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type
  PInteger = ^Integer;
 
var
  A, B: Integer;
...
procedure MyProc(C, D: PInteger);
begin
  Result := C^ - D^;
end;
 
A := 10;
B := 1;
MyProc(@A, @B);
Print(A); // A=9
C++
1
2
3
4
5
6
7
8
9
10
int A = 10;
int B = 1;
 
void MyProc(int *C, int *D)
{
  return (C - D);
}
 
MyProc(@A, @B);
cout << IntToStr(A); // A=9
nord_v
227 / 176 / 69
Регистрация: 22.08.2013
Сообщений: 724
15.12.2015, 22:31     Передача данных по значению и по ссылке #32
Цитата Сообщение от NeferSky Посмотреть сообщение
int A = 10;
int B = 1;
void MyProc(int & C, int & D)
{
return (C - D);
}
MyProc(A, B);
cout << IntToStr(A); // A=9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int A = 10;
int B = 1;
 
void MyProc(int & C, int& D)
{
  C = C - D;
}
 
int main()
{
    MyProc(A, B);
    cout <<  A; // A=9
}
Добавлено через 3 минуты
Цитата Сообщение от NeferSky Посмотреть сообщение
int A = 10;
int B = 1;
void MyProc(int *C, int *D)
{
return (C - D);
}
MyProc(@A, @B);
cout << IntToStr(A); // A=9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int A = 10;
int B = 1;
 
void MyProc(int *C, int *D)
{
  *C = *C - *D;
}
 
int main()
{
     MyProc(&A, &B);
     cout << A; // A=9
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2015, 06:46     Передача данных по значению и по ссылке
Еще ссылки по теме:
C++ Сравнение утраивания переменной по значению и по ссылке
C++ 3мя способами, по значению, по ссылке, через указатель
C++ Массив и классы (как передаётся объект: по значению или по ссылке?)
Помогите разобраться(С)Cпособы передачи аргументов в вызываемые функции: по значению, указателю и ссылке C++
C++ Передача по ссылке

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

Или воспользуйтесь поиском по форуму:
NeferSky
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 3
16.12.2015, 06:46     Передача данных по значению и по ссылке #33
nord_v, ох, действительно, что-то я намешал в одну кучу процедуры и функции - я больше об указателях в тот момент думал. А за ценные поправки в третьем примере - отдельное спасибо, теперь, вроде, информацию в голове упорядочил)
Yandex
Объявления
16.12.2015, 06:46     Передача данных по значению и по ссылке
Ответ Создать тему
Опции темы

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