2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77

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

08.07.2017, 23:26. Показов 6093. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru