Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/266: Рейтинг темы: голосов - 266, средняя оценка - 4.52
4 / 4 / 1
Регистрация: 16.09.2012
Сообщений: 119

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

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

Студворк — интернет-сервис помощи студентам
Всем привет!

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

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

Заранее спс за хелп!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.09.2012, 21:57
Ответы с готовыми решениями:

Передача по ссылке и по значению
Эта тема стара как мир, но я хотел уточнить одну вещь. QBluetoothAddress* address = new...

С - > C# Передача значений по ссылке и значению
Есть Си функция: double lagrange(double X, double *Xi, double *Yi, int n) //Аппроксимация многочленом Лагранжа. { int i, k; ...

Передача в метод по ссылке и по значению
Запутался малость... class Program { static void Main(string args) { List<string>...

32
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
30.01.2015, 14:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Gourmand Посмотреть сообщение
В результате с использованием только ссылок код получается более громоздкий и сложный. То есть, эффект ровно обратный.
Вот оно в чем дело - оказывается, разработчики библиотек (ввода-вывода, STL и др) просто боятся указателей и поэтому используют ссылки .
0
1 / 1 / 1
Регистрация: 29.01.2015
Сообщений: 72
30.01.2015, 15:12
Цитата Сообщение от hoggy Посмотреть сообщение
все тоже самое можно было бы сделать и без необходимости велосипедить собственный препроцессор
Это тоже непонимание. Во-1ых, без moc всё выглядело бы громоздко и муторно. Во-2ых, он в работе совершенно прозрачен, как будто его и нет вовсе.

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

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

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

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

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

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

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

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

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

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

на самом деле, при работе с Qt ссылки действительно не нужны
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.01.2015, 19:16
Цитата Сообщение от Gourmand Посмотреть сообщение
когда экземпляры объектов связаны, и эти связи меняются динамически - да, нужен
бред какой то.
0
1 / 1 / 1
Регистрация: 29.01.2015
Сообщений: 72
30.01.2015, 19:41
Цитата Сообщение от hoggy Посмотреть сообщение
бред какой то.
Гы... то есть, например, с динамически меняющимся деревом, в котором одни и те же узлы могут быть разных классов, дел иметь не приходилось. Ну бывает...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.01.2015, 19:58
Цитата Сообщение от Gourmand Посмотреть сообщение
Гы... то есть, например, с динамически меняющимся деревом, в котором одни и те же узлы могут быть разных классов, дел иметь не приходилось. Ну бывает...
Я попрошу вас не делать "гы", когда вы общаетесь со мною.
Потому что я могу подумать о вас, что вы - дурачок, и перестать с вами общаться.

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

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

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

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

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

Цитата Сообщение от hoggy Посмотреть сообщение
Достаточно просто было сказать, что нода может иметь родителя,
а может и не иметь, или сменить родителя на другого.
Этого вполне будет достаточно, что бы по смыслу задачи ссылка уже не подошла.
Тоже самое, только другими словами. У каждого свой язык C++. (С) Понимаете, к чему я клоню?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.01.2015, 21:30
Цитата Сообщение от 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
1 / 1 / 1
Регистрация: 29.01.2015
Сообщений: 72
30.01.2015, 23:28
Oh, my... Совсем не то, что я имел в виду. То есть, абсолютно не то. Ну да ладно.

Делайте сами, читайте сами - я ни на какие "вопросы" отвечать не собираюсь. Не в коня вопрос...
0
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 3
15.12.2015, 22:13
А есть тут паскальщики? Я несколько лет писал на 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
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
15.12.2015, 22:31
Цитата Сообщение от 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
}
0
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 3
16.12.2015, 06:46
nord_v, ох, действительно, что-то я намешал в одну кучу процедуры и функции - я больше об указателях в тот момент думал. А за ценные поправки в третьем примере - отдельное спасибо, теперь, вроде, информацию в голове упорядочил)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2015, 06:46
Помогаю со студенческими работами здесь

Передача параметров по указателю, ссылке и значению
Задание: Вычислить Y(x) и S(x). (где x принадлежит диапазону ) Y(x) и S(x) реализовать в виде отдельных функций. Продемонстрировать ...

Передача объекта по ссылке или о значению
Да, да, снова этот вопрос. Допустим у меня есть объект Student с полями String surname и String name. Этот объект лежит двух разных листах....

Конструкторы копирования, передача по ссылке и значению
Здравствуйте! Вопрос: существует конструктор копирования, которые принимает константный обьект по ссылке: Vector(const vector &amp;). ...

Передача параметров функции по значению, ссылке и указателю
Вычислить 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...

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


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru