Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/55: Рейтинг темы: голосов - 55, средняя оценка - 4.71
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170

В чем отличие int &f( ) от int f( )

19.11.2015, 17:23. Показов 10795. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что такое int & и чем отличается от int ?
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
#include <iostream>
 
using std::cout;
using std::endl;
 
int some(int i)
{
    return i;
}
 
int &some(char i)
{
    int n = i;
    return n;
}
 
int main()
{
    cout << some(47);
    cout << endl;
 
    cout << some('0');
    cout << endl;
 
    system("pause");
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.11.2015, 17:23
Ответы с готовыми решениями:

Напишите функцию f(int& m1, int& m0, int N), которая воз- вращает первую и последнюю цифры двузначного натурального числа N
Напишите функцию f(int&amp; m1, int&amp; m0, int N), которая воз- вращает первую и последнюю цифры двузначного натурального числа N. Решение. ...

Отличие int от int&
Расскажите пожалуйста в чем отличие int от int&amp;. Заранее спасибо.

в чем разница между void f(int &n) и void f(int &&n)
:help:

34
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
19.11.2015, 17:26
Lensato, первое - возвращает ссылку, второе - значение.
0
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
19.11.2015, 17:30  [ТС]
int & - это ссылка на int
Переформулирую, чем ссылка на int отличается от int?
Не, тороплюсь я с вопросами. Надо немного подумать, подытожить, сформулировать...
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.11.2015, 17:34
C++
1
2
3
4
5
int &some(char i)
{
    int n = i;
    return n;
}
UB же ж. При входе в функцию в стек ложится n, возвращается ссылка на этот n - но после выхода с функции c стека убирается n. И у нас ссылка на память, которая уже не валидна (будет там то же число или будет уже чтоот другое - гарантий никто не даст).

Хочу заметить, что для меня если строка кода(или часть кода) потенциально может содержать UB при определённых действиях юзверга или пользователя - код UB.
0
19.11.2015, 17:34

Не по теме:

Кажись, пора писать F.A.Q. по темам ссылок, массивов, указателей и т.д.

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
19.11.2015, 17:44
Поповоду отличия если отличный учебное задание
Напишите перегрузку оператора квадратные скобки для константного и не константного класса-контейнера.
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
#include <iostream>
using namespace std;
 
class A
{
private:
    const int m_size;
    int* m_arr;
 
public:
    A() : m_size(10)
    {
        m_arr = new int[m_size];
        setArray();
    }
    void setArray()
    {
        for(size_t i = 0; i < m_size; ++i)
        {
            m_arr[i] = i;
        }
    }
    ~A()
    {
        delete[] m_arr;
    }
    int operator[](size_t index) const      // if object is const return COPY of element
    {
        if(index > m_size)
            throw 1;
 
        return m_arr[index];
    }
    int& operator[](size_t index)           // if object is modify return refference on element
    {
        if(index > m_size)
            throw 1;
 
        return m_arr[index];
    }
};
 
 
int main()
{
    A a;
    cout << a[3] << endl;
    a[4] = 14;                              // ok cause was used int& operator[](size_t index);
 
    const A b;
    cout << b[3] << endl;
    b[4] = 14;                              // error cause was used int operator[](size_t index) const;
}
2
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
20.11.2015, 11:58  [ТС]
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Напишите перегрузку оператора квадратные скобки для константного и не константного класса-контейнера.
Отличный пример разницы между (int) и (int &), но по нему я не все смог себе объяснить.

Есть несколько утверждений и вопросов.
Все ли все ли утверждения верны?
Как объясняется преобразование int& в int ?
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
#include <iostream>
 
using std::cout;
using std::endl;
 
int func(int i) { return i; }
 
int &func(char i)
{
    int n = i;
    return n;
}
 
int glob = 7;
 
int main()
{
    int k = 0;                      // k - это переменная, в которой хранится значение типа int 
    int *i = &k;                    // i - это переменная, в которой хранится число которое является адресом значения типа int
    cout << "i = " << i << endl;    // выводится значение хранящееся в переменной i, которое является адресом некой ячейки памяти, 
                                    // считающейся типом int (т.е. выводится адрес)
    cout << "k = " << k << endl;    // выводится значение хранящееся в переменной k
    cout << "&i = " << &i << endl;  // выводится адрес ячейки памяти, в которой находится адрес на ячейку памяти которую надо читать как тип int
    cout << "&k = " << &k << endl;  // выводится адрес переменной k в которой находится значение типа int
 
    k = func(1);    /*  some(1) возвращает константное значение переменной i которое является константой
                        таким образом, функции 
                        int some(int i) { return i; } и
                        const int some(int i) { return i; }
                        полностью равнозначны (а может не полностью все-таки?)
                    */
    cout << "k = " << k << endl;
 
    k = func('1');  /*  some('1') возвращает значение типа "ссылка на int", т.е. адрес указвающий на int.
 
                        Поскольку k - это не указатель, и адрес на int она содержать не может, то
                        благодаря перегрузке (или не знаю чему, поправте меня) "ссылка на int"
                        преобразуется в значение типа int по этому адресу и присваивается переменной k
                        Дело третье, что адрес не валиден. Но сасибо rikimaru2013 что указал на это, я не знал.
                        */
    cout << "k = " << k << endl;
 
    //i = func('1');    // ошибка так как типы разные
    i = &k;             // i меняет адрес на который она указывает
    *i = func('0');     // i меняет значение по адрусу который она в себе хранит.
    cout << "*i = " << *i;
 
    /*
        i содержит в себе адрес ячейки памяти типа int, но не смотря на то, что func('1') 
        возвращает адрес на int, засунуть его в переменную i возможности нет 
        (т.е. я вообще не знаю как адрес выданный func('0') запихнуть в i)
 
        Кроме того, компилятор говорит, что i = func('1'); - это плохо потому, 
        что (int) нельзя присвоить (int *). А как же (int &)?
    */
 
    cout << k << endl;
 
    system("pause");
    return 0;
}
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
код UB
Ах да, как расшифровывается UB?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2015, 12:11

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
пора писать F.A.Q. по темам ссылок, массивов, указателей и т.д.
Лучше сразу учебник :) И потом конкурировать с существующими авторами.



Добавлено через 34 секунды
Цитата Сообщение от Lensato Посмотреть сообщение
как расшифровывается UB?
Undefined behaviour - неопределенное поведение.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
20.11.2015, 12:12
Цитата Сообщение от Lensato Посмотреть сообщение
как расшифровывается UB?
undefined behavior - неопределенное поведение
0
20.11.2015, 12:14

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
И потом конкурировать с существующими авторами.
Разве можно конкурировать с Либерти? :)

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.11.2015, 12:21
int k = 0; // k - это переменная, в которой хранится значение типа int
+
int *i = &k; // i - это переменная, в которой хранится число которое является адресом значения типа int
Нет, i это указатель(pointer), который хранит адресс переменной k, которая кстате в стеке.
cout << "i = " << i << endl; // выводится значение хранящееся в переменной i, которое является адресом некой ячейки памяти,
// считающейся типом int (т.е. выводится адрес)
cout << "k = " << k << endl; // выводится значение хранящееся в переменной k
cout << "&i = " << &i << endl; // выводится адрес ячейки памяти, в которой находится адрес на ячейку памяти которую надо читать как тип int
cout << "&k = " << &k << endl; // выводится адрес переменной k в которой находится значение типа int
+
k = func(1); /* some(1) возвращает константное значение переменной i которое является константой
таким образом, функции
int some(int i) { return i; } и
const int some(int i) { return i; }
полностью равнозначны (а может не полностью все-таки?)
где там some, где конст?
1)
C++
1
2
int some(int i) { return i; } и
                    const int some(int i) { return i; }
так нельзя перегрузить функции - дял компилятора это одно и тоже.
2)
C++
1
2
auto var = some(3);
var = 10; // error if const int


k = func('1'); /* some('1') возвращает значение типа "ссылка на int", т.е. адрес указвающий на int.

Поскольку k - это не указатель, и адрес на int она содержать не может, то
благодаря перегрузке (или не знаю чему, поправте меня) "ссылка на int"
преобразуется в значение типа int по этому адресу и присваивается переменной k
Дело третье, что адрес не валиден. Но сасибо rikimaru2013 что указал на это, я не знал.
*/
Напутали всё. Ничего не понял - снова напишу.
1) ссылка на int - это его псевдоним - погонялово))) Везде где зовут Черепа или использую Черепа - можно в уме подставить его настоящее имя. Ничего не изменится с точки объяснения себе, что происходит.
2) если функция возращает псевдоним - возвращаемое значение lvalue(рано вам еще понимать, что это) и туда куда пришёл псевдоним может к нему обращаться. В примере с массивом я показал как функция main записываем в псевдоним элеммента массива число и оно магическим образом появляется в самом массиве. Но у вас в коде UB( undefined behavior) не определёное поведение.

Причина:
1) main вызывает функцию
2) в стек (место в памяти с которым программа работает быстрее - погуглите там) ложится адресс возврата (куда вернутся после возвращения выполнения тела функции)
3) создается в стеке параметры для функции (ей же ж пришли данные - их же ж куда-то надо поместить)
4) далее в коде ей нужна переменная - она её создает в стеке - int n;
5) и возвращает псевдоним на эту переменную, к примеру Картавый, в место откуда вызывалась функция
6) функция уже не нужна - вызываются деструкторы всех локальных объектов и параметров в стеке ( оин все удаляются) и сама функция отдаёт контроль main - и умирает.
7) main то не знает что Картавый сдох - и начинает запихивать в него к пример число или читать число с него - а это уже некрофилией попахивает. И с точки зрения разработчиков языка - такая некрофилия может вернуть ожидаемое число, может вернуть любое другое, программа может критически завершится, программа может заказать себе билеты в Лас Вегас и много много другое. Именно последнее означает UB.
1
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
20.11.2015, 12:34  [ТС]
Пока читаю предыдущий ответ, еще одно утверждение (забыл написать).

i, k - это некие абстракции, представленные в буквенном виде для пользователей языка с++,
для облегченного запоминания адреса, типа и смысла ячейки адреса.
Эти абстракции работают в по правилам с++ в соответствии с их типом и адресом, сами по себе при этом
не являясь ни адресом, ни указателем, ни значением.
Адрес и тип абстракций являются по сути единственно важными параметрами для компилятора и компоновщика.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
20.11.2015, 12:35
Прикол в том, что в случае k = func('1') UB проявит себя с очень малой долей вероятности, так как значение скрывающееся за возвращаемой ссылкой сразу копируется в k (тип int), и если это произойдёт, то в дальнейшем k будет вполне валидным. А если мы напишем int& k = func('1') то будет копирована сама ссылка, и даже если в момент копирования значение было "валидным", то при дальнейшем её использовании никаких гарантий нет. В любом случае так писать нельзя.
Ссылку возвращают, как правило, в методах класса (ссылку на поле класса) или когда это ссылка на один из параметров функции. В случае с классами, возвращать ссылку тоже опасно:
C++
1
2
3
4
5
6
7
Data* data = new Data(...); 
...
int& k = data->get(); //метод int& Data::get();
...
delete data;
...
cout << k << endl; //k - ссылка невалидна, данные, на которые она ссылается, удалены.
0
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
20.11.2015, 12:38  [ТС]
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
где там some, где конст?
Прошу прощения, не some, а func.
В коде поменял название функции, а в комментариях забыл.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
20.11.2015, 12:39
Цитата Сообщение от Operok Посмотреть сообщение
k - ссылка невалидна, данные, на которые она ссылается, удалены.
зависит от устройства Data
Например:
C++
1
2
3
4
5
6
7
class Data 
{
private:
   static int data ;
public:
   int& Data::get() { return data; }
} ;
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
20.11.2015, 12:41
Цитата Сообщение от Croessmah Посмотреть сообщение
зависит от устройства Data
да, зависит, написал первое, что в голову пришло

Не по теме:

вредный вы кошак

0
20.11.2015, 12:43

Не по теме:

Цитата Сообщение от Operok Посмотреть сообщение
вредный вы кошак
да, я такой :D

0
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
20.11.2015, 13:02  [ТС]
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
int some(int i) { return i; } и
* * * * * * * * * * const int some(int i) { return i; }
так нельзя перегрузить функции - дял компилятора это одно и тоже.
Имеется в виду единственный экземпляр функции.
Т.е. допустим была в коде
C++
1
int func(int i) { return i; }
затем я заменяю ее на
C++
1
const int func(int i) { return i; }
И что никакой разницы для всего остального кода. Совсем?

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
lvalue(рано вам еще понимать, что это)
А что там понимать, это значение годное для использования слева от оператора присваивания, т.е. годное для записи в него значения.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2015, 13:05
Цитата Сообщение от Lensato Посмотреть сообщение
И что никакой разницы для всего остального кода. Совсем?
Для типа int разницы не будет. Для пользовательских типов возможны нюансы из-за наличия функций-членов. Можно будет вызвать только const версии.
0
49 / 49 / 31
Регистрация: 07.10.2015
Сообщений: 170
20.11.2015, 14:24  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Можно будет вызвать только const версии.
А, точно. Я же даже проверял это месяц назад.
И в примере с массивами это есть.
Но вообще, да. Искал-то разницу именно для типа int как выходного значения.

Добавлено через 1 час 5 минут
Всем спасибо, разобрался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2015, 14:24
Помогаю со студенческими работами здесь

Пусть объявлена функция void f(int i,int &j){.}. Параметр j является параметром
1)Пусть объявлена функция void f(int i,int &amp;j){...}. Параметр j является параметром a. по адресу b. по ссылке c. по значению ...

Как передать 0 в функцию типа f (int, int&)
Подскажите, почему при повторных вызовах f остается предыдущее значение S? Т.е. не обнуляется в теле f - {...s=0...} и как его обнулить?...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

в чем разница между int a и int *a?
люди подскажите начинающему... чем переменная отличается от указателя? допустим переменные int a char a ? и переменные int *a, char...

Чем отличается int от signed int?
в 32-разрядной системе, диапазон значений для int и signed int одинаковые - от -2147483648 до 2147483647. Так же для short int и signed...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru