Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 78

Передача параметров в функцию по ссылке

12.03.2020, 14:12. Показов 3313. Ответов 7
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Интересует функция в 70 строчке и её вызов в 113. Почему нужно параметры передавать по ссылке?(если передам по значению то выведет мусор)

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <iostream>
#include <cmath>
using namespace std;
int h = 0;
class Polinom {
    int *a, *copy;
    int n;
public:
    Polinom() :a(0), n(0) {}
    Polinom(int x) {
        n = x;
        a = new int[x];
        copy = new int[x];
    }
    void mas() {                                
        for (int i = 0; i < n; i++) {
            copy[i] = a[i];
        }
    }
    void input() {
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            copy[i] = a[i];
        }
    }
    int koef(int i) {
        return a[i];
    }
    void output() {                     
        for (int i = 0; i < n; i++) {
            if (n - i - 1 == 0) {
                if (a[i] < 0) {
                    cout << "(" << a[i] << ")";
                }
                else
                    cout << a[i];
            }
            else
                if (a[i] < 0) {
                    cout << "(" << a[i] << "x^" << n - i - 1 << ")" << " + ";
                }
                else
                    cout << a[i] << "x^" << n - i - 1 << " + ";
        }
    }
    int gorner(int x) {
        int s = copy[n - 1];
        for (int i = 2; i <= n; i++) { // з 2, бо -1 - перший член, <= бо n-n теж член.
            s *= x;
            s += copy[n - i];  // n - i = n - 2
        }
        cout << "\nIn a point x:   " << s;
        return s;
    }
    void derivative(int x) {
        for (int i = 0; i < n; i++) {
            copy[i] *= (n - i - 1);
            cout << copy[i] << " ";
        }
        gorner(x);
        mas();
    }
    ~Polinom() {
        delete[] a;
        delete[] copy;
    }
};
 
//функция для вывода коэффициентов возле Х, которым нету подобных
void output(int &max, int &n, int &m, int &k, Polinom &a, Polinom &b) {
    if (max == n) {
        for (int i = 0; i < k; i++) {
            cout << a.koef(i) << " ";
        }
    }
    else if (max == m) {
        for (int i = 0; i < k; i++) {
            cout << b.koef(i) << " ";
        }
    }
}
 
int main()
{
    int n, m, x;
    cout << "Enter n: ";
    cin >> n;
    cout << "Enter m: ";
    cin >> m;
    cout << "Enter x: ";
    cin >> x;
    Polinom a(n);
    Polinom b(m);
    cout << "Enter the first polinom: ";
    a.input();
    cout << "Enter the second polinom: ";
    b.input();
    cout << endl;
    cout << "First polinom: ";
    a.output();
    cout << "\nSecond polinom: ";
    b.output();
    cout << "\n\nFirst derivative: ";
    a.derivative(x);
    cout << "\nSecond derivative: ";
    b.derivative(x);
    cout << endl << endl;
    //сума
    int max = (n > m) ? n : m;
    int k = abs(n - m);
    cout << "\nSuma in a point: " << a.gorner(x) + b.gorner(x);
    cout << "\nKoefs: ";
    output(max, n, m, k, a, b);
    for (int i = k; i < max; i++) {
        if (max == n) {
            cout << a.koef(i) + b.koef(i - abs(n - m)) << " ";
        }
        else if (max == m) {
            cout << a.koef(i - abs(n - m)) + b.koef(i) << " ";
        }
    }
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.03.2020, 14:12
Ответы с готовыми решениями:

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

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

Передача параметров по ссылке
Стоит ли передавать все параметры (кроме скалярных и указателей) по сслыке? Т.е. вместо void doSomething(const int _count, const...

7
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,246
12.03.2020, 14:21
Цитата Сообщение от Eg0ra1 Посмотреть сообщение
Почему нужно параметры передавать по ссылке?
- какие именно праметры? Там 2 типа int и Polinom.

Добавлено через 5 минут
Если int передавать, то без разницы - по значению 4(8) байт скопируются в функции - не так много. Если для объектов передавать, то он может быть большой и тут надо либо по указателю, либо по ссылке передавать.
1
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,686
12.03.2020, 14:41
Лучший ответ Сообщение было отмечено Eg0ra1 как решение

Решение

Когда Вы передаете в функцию параметры по значению, функция инициализирует локальные переменные объявленные в её прототипе переданными значениями и обрабатывает их как свои локальные переменные, то есть значения в переменных которые вы передавали в функцию не затрагиваются - обрабатываются их локальные копии, которые по завершению функции выходят за пределы видимости и, по возможности, уничтожаются.
Если же функции переданы ссылки, то локальные переменные функции (те что объявлены в её прототипе) инициализируются адресами памяти тех переменных что Вы передаете функции и она (функция) работает с теми областями памяти в которых лежат переменные. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void foo(int a, int b){ a = std::rand(); b = std::rand(); a = ++a + ++b; }
void bar(int &a, int &b) { a = std::rand(); b = std::rand(); a = ++a + ++b; }
 
int main(void)
{
    int c, d; // объявили переменные - память выделена, но не инициализирована, в них мусор
    std::cout << "c= " << c << "  d= " << d << std::endl;
 
    foo(c, d); /* отдали на обработку, функция foo создала свои локальные переменные a и b,
присвоила им значения мусора из c и d, a и b обработались и вышли за пределы функции (из области видимости)
и память выделенная под a и b освободилась - c и d остались без изменений*/
 
    std::cout << "c= " << c << "  d= " << d << std::endl;
 
    bar(c, d); /* отдали на обработку, функция bar создала свои локальные переменные a и b,
которые также как c и d ссылаются на одни и теже области памяти,
a и b обработались и вышли за пределы функции (из области видимости) a и b содержащие адреса переменных c и d
уничтожились, но c и d по прежнему ссылаются на свои области памяти которые обрабатывались в функции bar
и теперь их значения изменились*/
 
    std::cout << "c= " << c << "  d= " << d << std::endl;
}
1
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 78
12.03.2020, 14:47  [ТС]
Спасибо, теперь понимаю разницу!
Если хочу изменить оригиналы передаваемых параметров, которые передаю в функцию, тогда нужно передавать по ссылке, а если просто использовать их и не изменять оригиналы, тогда передавать по значению.
А если в моём примере, я передаю все параметры типа int по значению, но переменные типа Polinom по ссылке, тогда обьекты классов нужно всегда передавать по ссылке?
0
 Аватар для vlisp
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,347
12.03.2020, 15:00
У тебя весь класс полинома написан неправильно и непонятно.
Полином это массив коэффициентов и их число. Все. и инициализировать его нужно также. а что у тебя - непонятно.
0
337 / 237 / 103
Регистрация: 26.03.2019
Сообщений: 407
12.03.2020, 15:09
Цитата Сообщение от Eg0ra1 Посмотреть сообщение
а если просто использовать их и не изменять оригиналы, тогда передавать по значению.
Если вы передаете какие-то сложные типы данных, лучше все равно передавать по ссылке, чтобы избежать копирования(например, там большой массив, который при передаче в функцию будет целиком копироваться). При этом добавляйте const, чтобы гарантировать, что данные не будут меняться:
C++
1
2
3
4
5
6
7
8
9
class A
{
   //какой-то класс
};
 
void func(const A& a)
{
   //какая-то функция, которая принимает объект типа A по ссылке и не изменяет его
}
Цитата Сообщение от Eg0ra1 Посмотреть сообщение
А если в моём примере
А в вашем примере вы не можете нормально передать по значению объект класса Polinom потому, что у него нет конструктора копирования, поэтому в случае передачи по значению компилятор его сам создаст, но результат может быть не тот, какой вы ожидаете. Более того, при выходе из функции деструктор может освободить память, занятую нужными вам данными в исходном объекте.

Есть такое "правило трех": если есть хотя бы один из методов (деструктор, конструктор копирования, оператор присваивания), то должны быть определены все три.
0
0 / 0 / 0
Регистрация: 07.10.2019
Сообщений: 78
12.03.2020, 15:21  [ТС]
Вот задание. Дано два полинома, найти их производные в точке Х, их суммы, разницы и произведение в точке Х за схемой Горнера, вывести коэффициэнты и написать для этого соответствующий класс
Миниатюры
Передача параметров в функцию по ссылке   Передача параметров в функцию по ссылке  
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,686
12.03.2020, 15:44
Цитата Сообщение от Eg0ra1 Посмотреть сообщение
Если хочу изменить оригиналы передаваемых параметров, которые передаю в функцию, тогда нужно передавать по ссылке, а если просто использовать их и не изменять оригиналы, тогда передавать по значению.
Передавать по значению нужно если функция должна изменять переданные ей данные, но после вызова этой функции Вам нужно воспользоваться оригинальными данными, которые у Вас были до вызова функции. Практически во всех остальных случаях лучше будет передавать данные посредством ссылок или указателей, как правило, либо для того чтобы избежать лишнего расхода памяти на создание дополнительных локальных копий данных, либо для модификации этих же данных напрямую в самой функции, либо если Вам нужно вернуть из функции больше одного значения - последнее можно реализовать через структуры данных, но, часто, удобнее передать функции пару тройку дополнительных параметров чем плодить структуры данных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.03.2020, 15:44
Помогаю со студенческими работами здесь

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

Передача параметров по ссылке
Вот задание: С клавиатуры вводится число, передается в вызываемую функцию, в ней найти сумму делителей и их число. Результат работы...

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru