2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3
 
 
Сообщение19.03.2008, 18:16 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Симпатичные грабли:
Код:
   int j = 1;
   int k = 2;
   int& intRef = k;
   intRef = j;
   cout << k << endl;

 Профиль  
                  
 
 
Сообщение19.03.2008, 20:48 


21/03/06
1545
Москва
незваный гость писал(а):
:evil:
Симпатичные грабли:
Код:
   int j = 1;
   int k = 2;
   int& intRef = k;
   intRef = j;
   cout << k << endl;

Да вроде бы обычное использование ссылок. Дурость конечно, но вроде бы подробно и тщательно описываемая в каждом учебнике по Си :).

 Профиль  
                  
 
 
Сообщение19.03.2008, 22:02 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
А какой ответ? И почему?

И почему это грабли?

 Профиль  
                  
 
 
Сообщение19.03.2008, 22:48 
Заслуженный участник


11/11/07
1198
Москва
незваный гость писал(а):
:evil:
А какой ответ? И почему?


k = 1. Ссылка инициализируется только при создании. А затем имя ссылки является "синонимом" для переменной.

 Профиль  
                  
 
 
Сообщение19.03.2008, 23:14 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Именно. Я бы сказал, что присваивания ссылке не сушествует: существует лишь присваивание значения.

Меня особенно радует сходство синтаксиса инициализации и присваивания, которые имеют совершенно разную семантику.

 Профиль  
                  
 
 
Сообщение19.03.2008, 23:28 


21/03/06
1545
Москва
Конечно, 1.

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

И меня, и меня :).

На самом деле, ни разу в своей практике не использовал умышленно ссылок :). Т.е. использовал (точнее разбирал выражения с ними) только при работе с чужим кодом.

Керниган и Ричи вроде бы пишут что-то про полезность ссылок, но я, если честно, забыл как и зачем они рекомендуют их применять. Вроде бы указатели и #define перекрывают все разумные применения ссылок. Даже более того - ссылка - это такой специальный вид константного указателя, имеющего зачем то свой особый синтаксис :? . Возможно я не прав, поправьте.

 Профиль  
                  
 
 
Сообщение20.03.2008, 01:01 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Ссылок в С нет, поэтому К.и Р. о них ничего не пишут.

e2e4 писал(а):
Вроде бы указатели и #define перекрывают все разумные применения ссылок.

Ничего подобного:
Код:
int& v = a[f(x)];
int b = v*v + 17 v;
никаким #define не покроешь. Даже если f(x) — просто выражение, а не вызов. Не говоря уж о приятных побочных эффектах.

e2e4 писал(а):
Возможно я не прав, поправьте.

reference в С++ — это приемлемый вид передачи параметра, подчёркивающий, что указатель — не массив, и не может меняться. Во всех остальных случаях (включая приведённый выше пример) она скорее задуривает мозги, чем помогает. Уж если надо, лучше так:
Код:
int* p = & a[f(x)];
int b = (*p)*(*p) + 17 (*p);
. Впрочем, это дело вкуса. Но уж больно больно наступать на эти детские грабли.



Пример, с которого всё началось — утрирован до безобразия. А вот попроще:
Код:
struct C_Test
{
  bool & bTest;
  bool bTestDefault;

  C_Test():bTest(bTestDefault){}

  void Set_New_Test(const bool & bNewTest)
  {
    bTest = bNewTest; // !!! потеря константности !!!
  }
};

Вопрос: почему компилятор не выдаёт ошибки, хотя невооружённым взглядом видна потеря константности? А вот когда заменяем ссылку на указатели, выдаёт.

Добавлено спустя 1 час 1 минуту 20 секунд:

e2e4 писал(а):
Вроде бы указатели и #define перекрывают все разумные применения ссылок.

Перечитал. При первом чтении пропустил указатели, что явно не говорит в пользу моей внимательности. :oops:

Указатели и #define, видимо, покрывают. Роль ссылок, как я понимаю, такая же, как у ++: всегда можно написать x += 1, но ++x удобнее.

 Профиль  
                  
 
 
Сообщение20.03.2008, 17:44 


07/12/05
240
Питер -> Ulm -> Koeln -> Ulm -> Bretten -> далее везде
незваный гость писал(а):
:evil:
Симпатичные грабли:
Код:
   int j = 1;
   int k = 2;
   int& intRef = k;
   intRef = j;
   cout << k << endl;

Наступал :twisted:

P.S.
Сейчас работаю в отделе разработки Rechenkern.
Kern по-немецки - ядро, а Rechen имеет (минимум) 2 значения:
1. Вычислительный (в составе сложных слов)
2. Грабли

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 38 ]  На страницу Пред.  1, 2, 3

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group