2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3
 
 
Сообщение19.03.2008, 18:16 
Аватара пользователя
:evil:
Симпатичные грабли:
Код:
   int j = 1;
   int k = 2;
   int& intRef = k;
   intRef = j;
   cout << k << endl;

 
 
 
 
Сообщение19.03.2008, 20:48 
незваный гость писал(а):
:evil:
Симпатичные грабли:
Код:
   int j = 1;
   int k = 2;
   int& intRef = k;
   intRef = j;
   cout << k << endl;

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

 
 
 
 
Сообщение19.03.2008, 22:02 
Аватара пользователя
:evil:
А какой ответ? И почему?

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

 
 
 
 
Сообщение19.03.2008, 22:48 
незваный гость писал(а):
:evil:
А какой ответ? И почему?


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

 
 
 
 
Сообщение19.03.2008, 23:14 
Аватара пользователя
:evil:
Именно. Я бы сказал, что присваивания ссылке не сушествует: существует лишь присваивание значения.

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

 
 
 
 
Сообщение19.03.2008, 23:28 
Конечно, 1.

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

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

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

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

 
 
 
 
Сообщение20.03.2008, 01:01 
Аватара пользователя
: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 
незваный гость писал(а):
: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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group