Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77

Использование ссылок и обычных имен переменных

08.07.2017, 23:26. Показов 5977. Ответов 82
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, у меня такой вопрос. Может быть он покажется довольно неинтересным вам, но мне просто надо понять кое-что.
Ссылка - это дополнительное имя для объекта. Имя объекта ссылается на его адрес.

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

Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.07.2017, 23:26
Ответы с готовыми решениями:

Использование имен предопределенных объектов в качестве имен переменных
Есть код: #include <iostream> using namespace std; void func() { int cout; cout <<cout <<endl; }

Использование переменных вместо имен таблицы и полей в SQL-запросах
что-то у меня ругается на подобную запись, пишет: 'неправильный синтаксис около конструкции "KLIENTS"' где-то я не так пишу: ...

Использование длинных имен переменных увеличивает вес файла с программой?
Использование длинных имен переменных увеличивает вес файла с программой?

82
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.07.2017, 09:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
Еще и ссылку на объект с объектом путаем.
Дык если Страуструп указатель с пальцем путает, то мне уж и подавно простительно.
Саша, эмоции мешают читать.
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
#include <iostream>
using namespace std;
struct TempObj{
int a;
TempObj():a(0){cout<<"default ctor "<<a<<endl;}
TempObj(int a_):a(a_){cout<<"convert to int  ctor "<<a<<endl;}
TempObj(const TempObj& tobj):a(tobj.a){cout<<"copy ctor "<<a<<endl;}
 
int operator+(const TempObj &lhs){
return lhs.a +  a;
}
 
};
 
int main(int argc, char* argv[])
{
TempObj 
        lhs(123),
const   rhs(234);
 
const TempObj &hz = lhs + rhs ;//запускается конструктор преобразования
 
//ВНИМАНИЕ словосочетание "может выглядеть" это не означает что ссылка и псевдокод это одно и то же самое
////то есть в псевдокоде это может выглядеть вот так: 
//const TempObj  temp_local_hz =  lhs + rhs ; // вызов преобразующего конструктора для втихую созданной temp_local_hz 
//const TempObj &hz =  temp_local_hz ; //тут всё нормально никто никому ничего не продлевает и не обрезает
// нет конструктора копии хотябы и слава богу
//просто налицо агромадный сайдэффект. Это удобно, но как говорится, удобными намерениями...
 
const TempObj &nehz = lhs;//нормально создаваемая ссылка не вызывает таких вещей и ведёт себя как указатель
//// нет конструктора копии 
//ВНИМАНИЕ словосочетание "ведёт себя как" не означает "тождественно является указателем"
system("pause");
return 0;
}
за минус 8 спасибо.
0
21.07.2017, 09:22

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
в C++17 описано не два, а три контекста с продлением жизни.
Раскрой тему.

0
21.07.2017, 10:24

Не по теме:

daun-autist, не разбирался еще.
Просто натыкался, что теперь там три контекста.
емнип, что-то связанное с копированием массивов.

0
21.07.2017, 10:33

Не по теме:

Croessmah, никогда не пытался считать контексты.

0
21.07.2017, 10:38

Не по теме:

daun-autist, а чего там считать?
Раньше в тандарте было написано
"Имеется два контекста бла-бла",
в C++17 же написано
"Имеется три контекста бла-бла".

0
21.07.2017, 10:57

Не по теме:

Croessmah, это в каком разделе?

0
21.07.2017, 16:14

Не по теме:

daun-autist, Special member functions -> Temporary objects

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2017, 18:45
Цитата Сообщение от daun-autist Посмотреть сообщение
инициализация встроенных и не-встроенных типов описывается принципиально по-разному.
см #26

а затем приведите пример принципиальных отличий.

Добавлено через 8 минут
Цитата Сообщение от Renji Посмотреть сообщение
Мне вот интересно, хоть кто-то на практике продлевает жизнь временного объекта с помощью ссылки? Или это нужно только для "а вот у ссылки есть, а у указателя нету!"?
в шаблоне юзается
C++
1
2
3
4
5
6
7
8
9
10
void foo(auto& src)
{
    ...
    const auto& val = get_name(src); // <--- здесь в зависимости от,
        // нам могут вернуть все что угодно
        // например - ссылку.
        // если бы мы принимали по значению
        // пришлось бы каждый раз конструировать новый объект
    ...
}
1
Заблокирован
27.07.2017, 18:48
Цитата Сообщение от hoggy Посмотреть сообщение
см #26
а затем приведите пример принципиальных отличий.
Запросто:

Цитата Сообщение от hoggy Посмотреть сообщение
в принципе это не принципиально.
В принципе это принципиально.

Допустим, что у int есть конструктор и используем такой псевдо-C++ синтаксис для его обозначения: int::int.
Тогда для инициализации int и помощью int-литерала — int a = 5; — нужно вызвать конструкто int int::int. Какой же параметр должен быть у этого конструктора, чтобы передать ему 5? Естественно, int: int::int(int). Но тогда для вызова этого конструктора необходимо инициализировать его параметр, т.е. вызвать для него конструктор int::int(int)... И так до бесконечности.

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


Цитата Сообщение от hoggy Посмотреть сообщение
что там "на самом деле" - не суть важно.
Суть важно.


Цитата Сообщение от hoggy Посмотреть сообщение
выглядит как утка. крякает как утка. плавает как утка.
Этот принцип не лежит в основании стандарта C++.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2017, 18:56
Цитата Сообщение от daun-autist Посмотреть сообщение
Допустим, что для инициализации int и помощью int-литерала
Цитата Сообщение от daun-autist Посмотреть сообщение
Какой же параметр должен быть у этого конструктора, чтобы передать ему 5?
конструктор, с параметром "int-литерал".

можете как угодно допустимо его называть.
не принципиально.

принципиально, что на практике вы имеете полное право считать,
что:

C++
1
2
T v; //<--- запуск дефолтного конструктора T
T v = T(); //<--- запуск конструктора копии
и тд.
со всеми возможными их вариациями.

принципиально, что закон един для всех.
вне зависимости от конкретного типа T


Добавлено через 2 минуты
Цитата Сообщение от daun-autist Посмотреть сообщение
Суть важно.
я попросил вас привести пример.
который иллюстрирует важность.

пример будет?

вот я вам привел пример,
который на практике иллюстрирует монопенисуальность момента.

Цитата Сообщение от daun-autist Посмотреть сообщение
Этот принцип не лежит в основании стандарта C++.
один из.
который именно что лежит в основании стандарта с++
на нем базируется сама идея шаблонов языка.
0
Заблокирован
27.07.2017, 19:04
Цитата Сообщение от hoggy Посмотреть сообщение
конструктор, с параметром "int-литерал".
Опиши этот конструктор псевдо-C++ синтаксисом.

Цитата Сообщение от hoggy Посмотреть сообщение
принципиально, что на практике вы имеете полное право считать,
что:
Мне на практике принципиально инициализировать типы. Если я не могу инициализировать фундаментальные типы из-за принципиально бесконечного вызова конструкторов — то я не могу инициализировать никакие типы, т.к. сложные типы строятся из фундаментальных и инициализация не-фундаментальных типов сводится в конце концов к инициализации фундаментальных.
Если тебе на практике не нужно инициализировать никакие объекты в C++ — ну что ж, ок. Просто это является крайне нестандартной ситуацией практики применения C++.

Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
T v; //<--- запуск дефолтного конструктора T
вне зависимости от конкретного типа T
Пруфца бы в виде ссылок на стандарт...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
27.07.2017, 19:05
Цитата Сообщение от hoggy Посмотреть сообщение
я попросил вас привести пример.
который иллюстрирует важность.
Согласно Вашей теории
C++
1
2
int x;//Запуск дефолтного конструктора.
int y{};//Запуск дефолтного конструктора.
Вопрос, почему первый случай приводит к неопределенному значению,
а второй к нулевому, если конструктор вызывается один и тот же?
1
Заблокирован
27.07.2017, 19:06
Цитата Сообщение от hoggy Посмотреть сообщение
я попросил вас привести пример.
который иллюстрирует важность.
Вот же он:
Цитата Сообщение от daun-autist Посмотреть сообщение
int a = 5;
Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Вопрос, почему первый случай приводит к неопределенному значению,
а второй к нулевому, если конструктор вызывается один и тот же?
ЭТО ПРИНЦИПИАЛЬНО НЕ ВАЖНО!!! ГЛАВНОЕ, ЧТО КРЯКАЕТ, КАК УТКА!!!
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
27.07.2017, 19:06
hoggy, то, что форма записи при инициализация одинаковая ни на что не влияет.
У нас же есть функторы, Вы же их функциями не называете, хотя они тоже крякать и плавать могут.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.07.2017, 19:08
Цитата Сообщение от daun-autist Посмотреть сообщение
Допустим, что у int есть конструктор и используем такой псевдо-C++ синтаксис для его обозначения: int::int.
Тогда для инициализации int и помощью int-литерала — int a = 5; — нужно вызвать конструкто int int::int. Какой же параметр должен быть у этого конструктора, чтобы передать ему 5? Естественно, int: int::int(int).
Естественно, int::int(const int&).
0
Заблокирован
27.07.2017, 19:11
Цитата Сообщение от Renji Посмотреть сообщение
Естественно, int::int(const int&).
Допустим, что мы хотим вызвать такой конструктор.
Но для байндинга ссылки к prvalue (а 5, бесусловно, являеся prvalue) нужно опять же создать временный объект типа int из 5 (что называется такими умными словами как temporary materialization).
Как его создать?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2017, 19:15
Цитата Сообщение от Croessmah Посмотреть сообщение
Вопрос, почему первый случай приводит к неопределенному значению,
а второй к нулевому, если конструктор вызывается один и тот же?
1. см #26

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

3.
см #28

Цитата Сообщение от daun-autist Посмотреть сообщение
int a = 5;
ну и что?

5 - литерная константа.

вы имеете полное право считать,
что это - такой временный объект(проходит как int&&),
со значением 5

C++
1
2
T a = T(b);
T a = b;
здесь нет никакого принципиального отличия от классовых типов.
с практической точки зрения отличий нет вообще.

Добавлено через 2 минуты
Цитата Сообщение от daun-autist Посмотреть сообщение
создать временный объект типа int из 5
циферка 5 это и есть уже созданный временный объект
который специально для вас заранее создал компилятор
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
27.07.2017, 19:18
Цитата Сообщение от hoggy Посмотреть сообщение
первый случай не приводит к не определенному поведению.
Причем здесь неопределенное поведение?
Неопределенное значение. Ладно, буду уточнять в следующий раз,
если уж вывести то, что речь идет о значении нельзя самостоятельно.

hoggy Вы путаете конструкторы и формы инициализации.
Именно в правилах инициализации описано как что будет инициализировано,
и не о каких вызовах конструкторов для фундаментальных типов там речи не идет.
Кстати, была же уже тема, где Вы эту свою теорию доказывали, только не получилось.
Если на катер поставить клаксон соответствующий, то он тоже сможет крякать и плавать.
Можете считать как угодно, но давайте не будем вешать лапшу на уши окружающим.
Я закончил. Не вижу смысла продолжать.
1
Заблокирован
27.07.2017, 19:20
Цитата Сообщение от hoggy Посмотреть сообщение
вы имеете полное право считать,
что это - такой временный объект(проходит как int&&),
со значением 5
Благодаря какому месту в стандарте у меня возникло такое право?

Цитата Сообщение от hoggy Посмотреть сообщение
циферка 5 это и есть уже созданный временный объект
Эх, пруфца бы... Но я его вряд ли дождусь.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2017, 19:38
Цитата Сообщение от Croessmah Посмотреть сообщение
то, что форма записи при инициализация одинаковая ни на что не влияет.
У нас же есть функторы, Вы же их функциями не называете, хотя они тоже крякать и плавать могут.
влияет.
именно что влияет.

простейший пример:
вам необходимо реализовать мета-функцию is_callable<f, type>::value
где type - тип функции (ret_t(args...))
вот она вернет true, если f - тип callable сущности,
у которой параметры аргументов и возвращаемый тип
совпадают с указанными.

для функции нужно проверить типы её параметров
для функтора - проверить типа параметров оператора()

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

на практике какие то все таки различия возникли.
не находите ли?

так может все ж таки немножко по разному они плавают, ага?

Добавлено через 3 минуты
Цитата Сообщение от daun-autist Посмотреть сообщение
Благодаря какому месту в стандарте у меня возникло такое право?
есть предположение,
что благодаря тому же самому,
благодаря которому вы обозвали циферку
Цитата Сообщение от daun-autist Посмотреть сообщение
бесусловно, являеся prvalue
Цитата Сообщение от daun-autist Посмотреть сообщение
Эх, пруфца бы... Но я его вряд ли дождусь.
да вам пруфец не поможет.

вам даже если код привести:

C++
1
2
3
4
5
6
void foo(int&&){}
 
int main()
{
    foo(5);
}
вам это скорее всего все равно никак не поможет.

у вас трудности как бе.
со смыслом как бе здравым.

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Вы путаете конструкторы и формы инициализации.
нет. не путаю.
см #26
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2017, 19:38

Удалить из имен обычных файлов (regular file) все цифры
Удалить из имен обычных файлов (regular file) все цифры.

Чем ссылки тега nav отличаются от обычных ссылок на странице?
Тега nav

Инициализация обычных статических переменных
Добрый вечер. Читаю небезызвестную философию джава. В одной из глав есть пример о порядке иницыализации статических и обычных полей. Код...

Отличие обычных переменных и глобальных
Здравствуйте, расскажите пожалуйста в чем отличие глобальных переменных об обычных объявляемых в процедуре?! Делал таймер, когда объявил...

Чтение имён переменных из файла и раскрытие этих переменных
Допустим есть скрипт &quot;1&quot;,в котором описано: set ueqrxbfmfi=t for /f &quot;usebackq tokens=*&quot; %%a in (&quot;test.txt&quot;) do set...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru